本文实例为大家分享了unity实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下
SatUIController代码
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
|
using UnityEngine; using UnityEngine.UI; public class StartUIController : MonoBehaviour { public Text lastText; public Text bestText; public Toggle blue; public Toggle yellow; public Toggle border; public Toggle noBorder; void Awake() { lastText.text = "上次:长度" + PlayerPrefs.GetInt( "lastl" , 0) + ",分数" + PlayerPrefs.GetInt( "lasts" , 0); bestText.text = "最好:长度" + PlayerPrefs.GetInt( "bestl" , 0) + ",分数" + PlayerPrefs.GetInt( "bests" , 0); } void Start() { if (PlayerPrefs.GetString( "sh" , "sh01" ) == "sh01" ) { blue.isOn = true ; PlayerPrefs.SetString( "sh" , "sh01" ); PlayerPrefs.SetString( "sb01" , "sb0101" ); PlayerPrefs.SetString( "sb02" , "sb0102" ); } else { yellow.isOn = true ; PlayerPrefs.SetString( "sh" , "sh02" ); PlayerPrefs.SetString( "sb01" , "sb0201" ); PlayerPrefs.SetString( "sb02" , "sb0202" ); } if (PlayerPrefs.GetInt( "border" , 1) == 1) { border.isOn = true ; PlayerPrefs.SetInt( "border" , 1); } else { noBorder.isOn = true ; PlayerPrefs.SetInt( "border" , 0); } } public void BlueSelected( bool isOn) { if (isOn) { PlayerPrefs.SetString( "sh" , "sh01" ); PlayerPrefs.SetString( "sb01" , "sb0101" ); PlayerPrefs.SetString( "sb02" , "sb0102" ); } } public void YellowSelected( bool isOn) { if (isOn) { PlayerPrefs.SetString( "sh" , "sh02" ); PlayerPrefs.SetString( "sb01" , "sb0201" ); PlayerPrefs.SetString( "sb02" , "sb0202" ); } } public void BorderSelected( bool isOn) { if (isOn) { PlayerPrefs.SetInt( "border" , 1); } } public void NoBorderSelected( bool isOn) { if (isOn) { PlayerPrefs.SetInt( "border" , 0); } } public void StartGame() { UnityEngine.SceneManagement.SceneManager.LoadScene(1); } } |
SnakeHead代码
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
using System.Collections; using System.Collections.Generic; //using System.Linq; using UnityEngine; using UnityEngine.UI; public class SnakeHead : MonoBehaviour { public List<Transform> bodyList = new List<Transform>(); public float velocity = 0.35f; public int step; private int x; private int y; private Vector3 headPos; private Transform canvas; private bool isDie = false ; public AudioClip eatClip; public AudioClip dieClip; public GameObject dieEffect; public GameObject bodyPrefab; public Sprite[] bodySprites = new Sprite[2]; void Awake() { canvas = GameObject.Find( "Canvas" ).transform; //通过Resources.Load(string path)方法加载资源,path的书写不需要加Resources/以及文件扩展名 gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>(PlayerPrefs.GetString( "sh" , "sh02" )); bodySprites[0] = Resources.Load<Sprite>(PlayerPrefs.GetString( "sb01" , "sb0201" )); bodySprites[1] = Resources.Load<Sprite>(PlayerPrefs.GetString( "sb02" , "sb0202" )); } void Start() { InvokeRepeating( "Move" , 0, velocity); x = 0;y = step; } void Update() { if (Input.GetKeyDown(KeyCode.Space) && MainUIController.Instance.isPause == false && isDie == false ) { CancelInvoke(); InvokeRepeating( "Move" , 0, velocity - 0.2f); } if (Input.GetKeyUp(KeyCode.Space) && MainUIController.Instance.isPause == false && isDie == false ) { CancelInvoke(); InvokeRepeating( "Move" , 0, velocity); } if (Input.GetKey(KeyCode.W) && y != -step && MainUIController.Instance.isPause == false && isDie == false ) { gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0); x = 0;y = step; } if (Input.GetKey(KeyCode.S) && y != step && MainUIController.Instance.isPause == false && isDie == false ) { gameObject.transform.localRotation = Quaternion.Euler(0, 0, 180); x = 0; y = -step; } if (Input.GetKey(KeyCode.A) && x != step && MainUIController.Instance.isPause == false && isDie == false ) { gameObject.transform.localRotation = Quaternion.Euler(0, 0, 90); x = -step; y = 0; } if (Input.GetKey(KeyCode.D) && x != -step && MainUIController.Instance.isPause == false && isDie == false ) { gameObject.transform.localRotation = Quaternion.Euler(0, 0, -90); x = step; y = 0; } } void Move() { headPos = gameObject.transform.localPosition; //保存下来蛇头移动前的位置 gameObject.transform.localPosition = new Vector3(headPos.x + x, headPos.y + y, headPos.z); //蛇头向期望位置移动 if (bodyList.Count > 0) { //由于我们是双色蛇身,此方法弃用 //bodyList.Last().localPosition = headPos; //将蛇尾移动到蛇头移动前的位置 //bodyList.Insert(0, bodyList.Last()); //将蛇尾在List中的位置更新到最前 //bodyList.RemoveAt(bodyList.Count - 1); //移除List最末尾的蛇尾引用 //由于我们是双色蛇身,使用此方法达到显示目的 for ( int i = bodyList.Count - 2; i >= 0; i--) //从后往前开始移动蛇身 { bodyList[i + 1].localPosition = bodyList[i].localPosition; //每一个蛇身都移动到它前面一个节点的位置 } bodyList[0].localPosition = headPos; //第一个蛇身移动到蛇头移动前的位置 } } void Grow() { AudioSource.PlayClipAtPoint(eatClip, Vector3.zero); int index = (bodyList.Count % 2 == 0) ? 0 : 1; GameObject body = Instantiate(bodyPrefab, new Vector3(2000, 2000, 0), Quaternion.identity); body.GetComponent<Image>().sprite = bodySprites[index]; body.transform.SetParent(canvas, false ); bodyList.Add(body.transform); } void Die() { AudioSource.PlayClipAtPoint(dieClip, Vector3.zero); CancelInvoke(); isDie = true ; Instantiate(dieEffect); PlayerPrefs.SetInt( "lastl" , MainUIController.Instance.length); PlayerPrefs.SetInt( "lasts" , MainUIController.Instance.score); if (PlayerPrefs.GetInt( "bests" , 0) < MainUIController.Instance.score) { PlayerPrefs.SetInt( "bestl" , MainUIController.Instance.length); PlayerPrefs.SetInt( "bests" , MainUIController.Instance.score); } StartCoroutine(GameOver(1.5f)); } IEnumerator GameOver( float t) { yield return new WaitForSeconds(t); UnityEngine.SceneManagement.SceneManager.LoadScene(1); } private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.CompareTag( "Food" )) { Destroy(collision.gameObject); MainUIController.Instance.UpdateUI(); Grow(); FoodMaker.Instance.MakeFood((Random.Range(0, 100) < 20) ? true : false ); } else if (collision.gameObject.CompareTag( "Reward" )) { Destroy(collision.gameObject); MainUIController.Instance.UpdateUI(Random.Range(5, 15) * 10); Grow(); } else if (collision.gameObject.CompareTag( "Body" )) { Die(); } else { if (MainUIController.Instance.hasBorder) { Die(); } else { switch (collision.gameObject.name) { case "Up" : transform.localPosition = new Vector3(transform.localPosition.x, -transform.localPosition.y + 30, transform.localPosition.z); break ; case "Down" : transform.localPosition = new Vector3(transform.localPosition.x, -transform.localPosition.y - 30, transform.localPosition.z); break ; case "Left" : transform.localPosition = new Vector3(-transform.localPosition.x + 180, transform.localPosition.y, transform.localPosition.z); break ; case "Right" : transform.localPosition = new Vector3(-transform.localPosition.x + 240, transform.localPosition.y, transform.localPosition.z); break ; } } } } } |
MainUIController
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
|
using UnityEngine; using UnityEngine.UI; public class MainUIController : MonoBehaviour { private static MainUIController _instance; public static MainUIController Instance { get { return _instance; } } public bool hasBorder = true ; public bool isPause = false ; public int score = 0; public int length = 0; public Text msgText; public Text scoreText; public Text lengthText; public Image pauseImage; public Sprite[] pauseSprites; public Image bgImage; private Color tempColor; void Awake() { _instance = this ; } void Start() { if (PlayerPrefs.GetInt( "border" , 1) == 0) { hasBorder = false ; foreach (Transform t in bgImage.gameObject.transform) { t.gameObject.GetComponent<Image>().enabled = false ; } } } void Update() { switch (score / 100) { case 0: case 1: case 2: break ; case 3: case 4: ColorUtility.TryParseHtmlString( "#CCEEFFFF" , out tempColor); bgImage.color = tempColor; msgText.text = "阶段" + 2; break ; case 5: case 6: ColorUtility.TryParseHtmlString( "#CCFFDBFF" , out tempColor); bgImage.color = tempColor; msgText.text = "阶段" + 3; break ; case 7: case 8: ColorUtility.TryParseHtmlString( "#EBFFCCFF" , out tempColor); bgImage.color = tempColor; msgText.text = "阶段" + 4; break ; case 9: case 10: ColorUtility.TryParseHtmlString( "#FFF3CCFF" , out tempColor); bgImage.color = tempColor; msgText.text = "阶段" + 5; break ; default : ColorUtility.TryParseHtmlString( "#FFDACCFF" , out tempColor); bgImage.color = tempColor; msgText.text = "无尽阶段" ; break ; } } public void UpdateUI( int s = 5, int l = 1) { score += s; length += l; scoreText.text = "得分:\n" + score; lengthText.text = "长度:\n" + length; } public void Pause() { isPause = !isPause; if (isPause) { Time.timeScale = 0; pauseImage.sprite = pauseSprites[1]; } else { Time.timeScale = 1; pauseImage.sprite = pauseSprites[0]; } } public void Home() { UnityEngine.SceneManagement.SceneManager.LoadScene(0); } } |
FoodMaker代码
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
|
using UnityEngine; using UnityEngine.UI; public class FoodMaker : MonoBehaviour { private static FoodMaker _instance; public static FoodMaker Instance { get { return _instance; } } public int xlimit = 21; public int ylimit = 11; public int xoffset = 7; public GameObject foodPrefab; public GameObject rewardPrefab; public Sprite[] foodSprites; private Transform foodHolder; void Awake() { _instance = this ; } void Start() { foodHolder = GameObject.Find( "FoodHolder" ).transform; MakeFood( false ); } public void MakeFood( bool isReward) { int index = Random.Range(0, foodSprites.Length); GameObject food = Instantiate(foodPrefab); food.GetComponent<Image>().sprite = foodSprites[index]; food.transform.SetParent(foodHolder, false ); int x = Random.Range(-xlimit + xoffset, xlimit); int y = Random.Range(-ylimit, ylimit); food.transform.localPosition = new Vector3(x * 30, y * 30, 0); if (isReward) { GameObject reward = Instantiate(rewardPrefab); reward.transform.SetParent(foodHolder, false ); x = Random.Range(-xlimit + xoffset, xlimit); y = Random.Range(-ylimit, ylimit); reward.transform.localPosition = new Vector3(x * 30, y * 30, 0); } } } |
代码放置如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_50642897/article/details/115310370