使用unity做经典游戏贪吃蛇
1.创建一个蛇头,制作一个红色cube立方体,控制着蛇的运动方向,以及遇到食物吃掉食物的功能。
创建一个c#脚本
在Update()里 WSAD及方向键控制着蛇头的运动方向。且在蛇头向上运动的时候不能向下运动,蛇在向左运动时候不能向右运动。
void Update () {
if (Input.GetKey(KeyCode.W)||Input.GetKey("up")&&direction!= Vector2.down)
{
direction = Vector2.up;
}
if (Input.GetKey(KeyCode.S) || Input.GetKey("down") && direction != Vector2.up)
{
direction = Vector2.down;
}
if (Input.GetKey(KeyCode.A) || Input.GetKey("left") && direction != Vector2.right)
{
direction = Vector2.left;
}
if (Input.GetKey(KeyCode.D) || Input.GetKey("right") && direction != Vector2.left)
{
direction = Vector2.right;
}
}
蛇在碰撞上食物后,身体会增长一节。遇到食物的时候,会先毁灭掉食物,再增加自己身体的长度。这个时候设置的碰撞位flag就会变为true,身体长度会增加。但是,在碰到自己的时候,以及在遇到墙壁的时候都会死亡,这个时候就会导入进开始时候的场景。
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Food"))
{
//Debug.Log("撞上了!");
Destroy(other.gameObject);
flag = true;
}
else
{
//SceneManager.LoadScene(0)
Application.LoadLevel(1);
}
}
2.身体的部分
身体每次增长的算法便是贪吃蛇的难点,网上很多算法是利用list链表来实现的,用链表的节点表示蛇 增加的减少都有很方便 移动的时候只须增加一个头节点,并去掉尾节点就行了, 吃食物是只须增加一个头节点 。
这种算法绝对的巧妙,但是网上太多的缘故,下面由链表来实现另一种贪吃蛇算法。蛇头保持不动,身体的最后一个移到最前,之后在慢慢向后移动。
其中下面的蓝色方块(身体部分的一个设定)一步一步运动,便可以看出来这个效果。
下面贴出蛇身体部分的代码。如果食物被吃,标志位flag为true,这个是在蛇身体上插入一个预制体的Cube,蛇身体会边长。当没有吃到食物的时候,这个时候就会看身体的数量,当数量大于0的时候,会把最后的一个放到最前面,依次循环,直到最后。
void Move()
{
Vector3 VPosition = transform.position;
transform.Translate(direction);
if (flag)
{
GameObject bodyPrefab = (GameObject)Instantiate(gameObjecgtBody, VPosition, Quaternion.identity);
Body.Insert(0, bodyPrefab.transform);
flag = false;
}
else if (Body.Count > 0)
{
Body.Last().position = VPosition;
Body.Insert(0, Body.Last());
Body.RemoveAt(Body.Count - 1);
}
}
3.食物
食物的出现是一个随机的过程,在这个时候,在随机的位置出现食物InvokeRepeating(“ShowFood”, 1, 4);表示四秒的时候会调用ShowFood()函数,这个时候在ShowFood里会随机出现食物。
下面是ShowFood()函数的代码
void ShowFood()
{
int x = Random.Range(-30, 30);
int y = Random.Range(-22, 22);
Instantiate(SSFood, new Vector2(x,y), Quaternion.identity);
}
特别注意一下就是,在制作蛇头和身体的时候,设置碰撞体的东西如果把碰撞体的体积设为单位1的话,在蛇身体的侧面也会撞到食物,触发碰撞器的。所以设置碰撞体的体积为0.8,略小于1的。