本文实例为大家分享了Unity实现3D贪吃蛇移动的具体代码,供大家参考,具体内容如下
记录一下前段时间写到的一个3D贪吃蛇的移动代码。
链接:Unity实现3D贪吃蛇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { List<Transform> bodyList = new List<Transform>(); //身体位置的列表 private float speed = 2f; //移动速度 public GameObject bodyObj; //用来生成的身体对象 List<Transform> bodyCreatePostion = new List<Transform>(); //身体部分的transfrom 列表 private float TransOffset=1f; //位置间隔 private List<Vector2> mapAddress= new List<Vector2>(); //前进目标在地图上的位置, public Transform firstBody; //第一个身体部件的transfrom const int row = 100; //地图宽 const int col = 100; //地图高 int step=1; //步伐 int x=0, z=0; //记录x和z轴的移动量 // Start is called before the first frame update public Vector3[,] map = new Vector3[row, col]; //地图 // Start is called before the first frame update void Start() { for ( int i = 0; i < row; i++) //生成地图 { for ( int j = 0; j < col; j++) { map[i, j] = new Vector3(i, 1.5f, j); } } transform.position =map[0,0];将当前位置设为原点 mapAddress.Add( new Vector2(1,0)); //增加第一个目标 bodyList.Add(transform); //刷新第一个头和一个身体的transform bodyList.Add(firstBody); mapAddress.Add( new Vector2(0,0)); } // Update is called once per frame void Update() { for ( int i = 0; i < row - 1; i++) { for ( int j = 0; j < col - 1; j++) //绘制地图格子 { Debug.DrawLine(map[i, j], map[i + 1, j], Color.red); Debug.DrawLine(map[i, j], map[i, j + 1], Color.red); } } if (Input.anyKeyDown) //有任何键按下 { if (Input.GetKeyDown(KeyCode.W) && z != -step) //上 { z = step; x = 0; } if (Input.GetKeyDown(KeyCode.S) && z != step) //下 { z = -step; x = 0; } if (Input.GetKeyDown(KeyCode.A) && x != step) //左 { x = -step; z = 0; } if (Input.GetKeyDown(KeyCode.D) && x != -step) //右 { x = step; z = 0; } } Move(); } private void Move() //移动 { if (Vector3.Distance(bodyList[0].position, map[( int )mapAddress[0].x + x, ( int )mapAddress[0].y + z]) < 0.7f) //当前坐标和目标位置的距离小于0.5f { for ( int i = mapAddress.Count - 1; i > 0; i--) //刷新后一个的目标为前一个的目标 { mapAddress[i] = mapAddress[i-1]; } mapAddress[0] = new Vector2(mapAddress[0].x + x, mapAddress[0].y + z); //刷新第一个目标的位置 } else { for ( int i = bodyList.Count - 1; i > 0; i--) //移动 { bodyList[i].position = Vector3.MoveTowards(bodyList[i].position, map[( int )mapAddress[i - 1].x, ( int )mapAddress[i - 1].y], Time.deltaTime * speed); } bodyList[0].position = Vector3.MoveTowards(transform.position, map[( int )mapAddress[0].x + x, ( int )mapAddress[0].y + z], Time.deltaTime * speed); } } private void OnCollisionEnter(Collision collision) //碰撞到了食物就增加身体长度 { if (collision.collider.tag == "Food" ) { Destroy(collision.collider.gameObject); GameObject tmpGameObject= new GameObject(); Vector2 tmpVec = new Vector2(); tmpGameObject = Instantiate(bodyObj, map[( int )mapAddress[mapAddress.Count - 1].x+x, ( int )mapAddress[mapAddress.Count - 1].y +z], Quaternion.identity); //生成body物体 tmpVec = new Vector2(mapAddress[mapAddress.Count - 1].x+x, mapAddress[mapAddress.Count - 1].y +z); //增加身体的transform和目标向量 bodyList.Add(tmpGameObject.transform); mapAddress.Add(tmpVec); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_41487299/article/details/101036418