首先附上头部代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class trans : MonoBehaviour {
    //
    
    public GameObject foodPrefab;
    public GameObject bodyPrefab;
    public float speed=2;
    private bool _isOver=false;

//计时器
    private float _Time = 0f;

//链表头部第一个身体部分
    private body FirstBody;

//链表尾部最后一个身体部分
    private body LastBody;
    private Vector3 now_pos;
    private enum direction {
        forward,
        back,
        left,
        right,
    };
    private direction _now = direction.forward;
    private direction _turn=direction.forward;
    // Use this for initialization
    void Start() {
        createFood();

}
    void createFood() {
        float x = Random.Range(-9.5f, 9.5f);
        float z = Random.Range(-9.5f, 9.5f);                    //旋转自身的角度(不旋转)
        GameObject food = Instantiate(foodPrefab,new Vector3(x,0f,z),Quaternion.identity) as GameObject;
    }
     
    void OnTriggerEnter(Collider other) {   //这个other就是被碰撞体
        
        if (other.tag.Equals("bound")|| other.tag.Equals("body")) {
            
            _isOver = true;
        }
        else if (other.tag.Equals("food")) {
           Destroy(other.gameObject);
            createBody();
            createFood();
            }
    }

// Update is called once per frame
    void Update() {
        if (!_isOver){
            check_key_toMove(speed);
        }
      
    }
    void createBody(){
       GameObject _body = Instantiate(bodyPrefab,new Vector3(9999f,9999f,9999f),Quaternion.identity) as GameObject;
        if (_body == null) {
        
        }
        //obj与body类绑定获取方法(刚开始是猜测)
        //我在疑惑既然是绑定也就是说脚本body和GameObject类型的_body绑定了,却显示空指针异常
        //为何还要把body脚本绑定在身子GameObject的模型上成为预制体才能正常,这不是多此一举吗
        //事后我又把body脚本绑定在head的(GameObject)模型上,依然显示空指针异常
        //根据事实结果我的猜测是错误的,根据字义理解是获取成分
        //我再次推测GetComponent并没有绑定,只是单纯的获取bodyprefab的成分
        //于是为了验证,我去查了官方文档
        //Returns the component of Type type if the game object has one attached, null if it doesn't.
        //果不其然获取依附在GameObject(bodyPrefab)的成分,如果没有就返回空。果然空指针就是这么引起的
        //由此看来后来的假设是正确的,其实现在想想以前的想法确实挺傻,给body脚本一个模型成预制体->创建Gameobject->选取Gameobject的成份就是为了调用脚本,就行了
        body obj =_body.GetComponent<body>();
        
        if (FirstBody == null) {
            //C#这里是吧obj的地址赋予给了FirstBody,而不是克隆
      
            FirstBody = obj;
        }
        if (LastBody != null) {
           
            LastBody.next = obj;
        }
        LastBody = obj;

}
    
    void check_key_toMove(float Speed){
        if (Input.GetKey(KeyCode.W)) {
            //如果当前方向为下根据游戏规则他是不能按上的,否则响应按键
            if (_now != direction.back)
            {
                _turn = direction.forward;
            }
            else {
                //如果当前方向为为下,他会忽视按键,继续当前方向运行。
                _turn = _now;
            }

}
        else if (Input.GetKey(KeyCode.S)){
            
            if (_now != direction.forward)
            {
                _turn = direction.back;
            }
            else
            {
                _turn = _now;
            }

}
        else if (Input.GetKey(KeyCode.A))
        {
          
            if (_now != direction.right)
            {
                _turn = direction.left;
            }
            else
            {
                _turn = _now;
            }

}

else if (Input.GetKey(KeyCode.D))
        {     //相当于自身的蓝线(Z轴)改变了正方向,他是旋转性的改变。
            
            if (_now != direction.left)
            {
                _turn = direction.right;
            }
            else
            {
                _turn = _now;
            }
        }
        _Time += Time.deltaTime;
        if (_Time >= 1f / Speed) {
            switch (_turn) {
                case direction.left: transform.forward = Vector3.left; break;
                case direction.right: transform.forward = Vector3.right; break;
                case direction.forward: transform.forward = Vector3.forward; break;
                case direction.back: transform.forward = Vector3.back; break;
            }
            move();
            _Time = 0f;
        }
    }
    void move(){

now_pos = transform.position;
        //这里沿着自身蓝线(Z轴)前进,但是世界坐标并没有改变
        //Vector3.forward虽说是(0,0,1)但是这里是相对于自身蓝线进行的(0,0,1),见Translate的解释
        //如果相对于世界的话需要引入第二个参数Space.World,见transform.forward与Vector.forward的区别
        transform.Translate(Vector3.forward);
        _now = _turn;
        if (FirstBody != null) {
            FirstBody._move(now_pos);
            }
        }
}

再次附上body代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class body : MonoBehaviour {
    //下一个body的引用,其实就是链表
    public body next;
    public int say() {
        return 5;
    }
    public void _move(Vector3 pos) {
        Vector3 nextPos = transform.position;
        transform.position = pos;
        if (next != null)
        {
            next._move(nextPos);
        }
    }
}

Time.deltaTime代表的是一秒为单位每帧消耗的时间, 在Update中 就是按帧来运行的 一秒运行60次60帧。 当一个数据乘以Time.deltaTime时代表一秒钟走该数据,而不是每帧走该数据。在update中Time.deltaTime 大约平均在在1/60=0.016秒。

总结:自己突发想法写一个游戏,来验收自己最近学习的成果,因为初学,于是选择了较为简单的贪吃蛇,代码根据思路,贪吃蛇就是单纯的用到了链表,总其步骤有5步:第一步创建蛇头让蛇头自由运动加入刚体创建碰撞触发器(墙的边缘),第二部创建食物(完善碰撞触发器),第三部创建身体(完善脚本,算法用到的就是链表,进行构造链表方法,完成body预制体) 第四部蛇头引入body预制体完成链表并开始移动  第五步测试最终BUG,除了第二步第三步  第一步第四部第五步都遇到到了难点疑点,在注释中大多都标注了,我相信天道酬勤,写此文章,警示以及勉励今后我unity3D的学习。

U3D贪吃蛇心得以及个人遇到的问题警戒以及勉励今后的自己相关推荐

  1. c语言贪吃蛇实践总结与体会,贪吃蛇心得体会

    1.建立三个外接文件,分别是写出游戏引擎.描述食物的.描述蛇的js. 2.在主页面进行游戏的运行. 3.在游戏引擎的页面里面,分别定义行数和列数,然后定义一个空的数组A.开始有戏的引擎的函数里面包含了 ...

  2. 贪吃蛇小游戏编写心得

    https://github.com/Devilzero/6 http://www.cnblogs.com/liangjianming/p/4510346.html package 贪吃蛇; impo ...

  3. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

  4. 你真以为贪吃蛇是个简单的游戏?

    博客搬家:最爱午后红茶 诺基亚手机经典游戏,规则不多说~ 先上一个多年前火了一段时间的 gif 动态图以表达敬意: 听说这是一个俄罗斯人用程序实现的. 所以这里想谈一下 贪吃蛇如何才能把地图填满? 我 ...

  5. #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏

    #进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏. 想必很多大一新生在刚学C语言时和我们遇到过同样的问题,就是如何去做第一个C语言大作业. 我们小组内部在讨论大作业时,并不打算 ...

  6. 【C语言】贪吃蛇游戏的实现(一)

    (注意:本代码是在VC++6.0环境下编译的,在其他环境如codeblocks下运行可能会产生意想不到的问题,请尽量使用VC.至于为什么要使用VC编译,哦,我亲爱的朋友,这只有上帝才知道) 最近由于小 ...

  7. 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇

    用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 本人新手,刚自学python满半年,现分享下心得,希望各位老手能指点一二,也希望和我一样的新手能共勉,谢谢~ 大家都知道用python做 ...

  8. java小游戏贪吃蛇

    开发工具 :eclips 运行主要代码截图 实现的功能: (1)播放bgm并且可以通过空格暂停 (2)空格实现游戏暂停,再次空格可以继续游戏 (3)头碰到尾巴会结束游戏 (4)右上角可以记录贪吃蛇的长 ...

  9. c语言贪吃蛇大作业报告,C语言贪吃蛇实验报告

    C语言贪吃蛇实验报告 C 语言程序设计实训报告姓 名 专 业 班 级 指导教师 二 011 年 7 月 14 日I I目录1 实训目的和要求 11.1 实训目的和任务 11.2 实训要求 12 实训任 ...

最新文章

  1. 10分钟学会php面相对象基础(Ⅰ)
  2. [云炬创业基础笔记]第一章创业环境测试8
  3. 复制多级文件夹【应用】
  4. 详细关闭iiop方法_疏通暖气片堵塞的方法,看完你就知道了!
  5. http 直接显示目录下文件_Linux文件管理(下)
  6. UR5 IK group中遇到的问题
  7. 如何下载项目所需要jar包
  8. 【jvm】jdk编译-未成功
  9. XXXXRockey4ND加密狗复制
  10. IDS和IPS是什么,有什么区别?
  11. python列表和字典的区别_Python中列表和字典有什么区别,分别适用于什么场景?...
  12. Excel电子表格操作
  13. SaaS启动阶段增长指南(上)
  14. 常见杀软对应的进程名
  15. 帝国CMS7.2重置后台密码
  16. ps教程:教你如何制作一种牛仔布料
  17. 微博红包技术探究:架构、防刷、监控和资源调度
  18. wps思维导图聚焦模式是灰色不能用的解决方案
  19. 算法复杂度:算法时间复杂度和空间复杂度表示法
  20. js实现touch移动触屏滑动事件

热门文章

  1. 最经典的flash鼠标绘画技术详解(六)
  2. 揭秘郭盛华在世界的排名,才华与颜值并存的男神
  3. 代码块(静态代码块和非静态代码块)(重难点)
  4. Safari访问本地html,safari本地文件读取漏洞之扩展攻击面 | CN-SEC 中文网
  5. 华为OD机试题 - 基站维修工程师(JavaScript)| 机考必刷
  6. 桶排序 (详细图解)
  7. 日常DDoS防御的一些小知识
  8. SpringBoot实现WebSocket
  9. opencv3.1 提取图像中某一像素点的HSV值并判断颜色
  10. 【Leedcode】环形链表必备的面试题和证明题(附图解)