首先附上头部代码:
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代码
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的学习。