贪吃蛇
注意步骤如下
* 1.确定蛇方向 ,wsad键控制
* 2.蛇头/蛇身预设物
* 3.碰撞食物,生成随机食物
设计较为简单,源码如下:
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
//贪吃蛇
public class SnakeMove : MonoBehaviour {
//控制蛇头移动函数二维
Vector3 SnakeVec = Vector3.up;
//蛇头
public GameObject SnakeHead;
//食物,多种
public GameObject[] SnakeFood;
//是否要创建身体
public bool IsGreat = false;
//存储身体位置信息
List<Transform> SnakeList = new List<Transform>();
public float Speed = 1f;
// Use this for initialization
void Start () {
for (int i = 0; i < 4; i++)
{
Invoke("OnGreatFood",0.3f); //初始值生成4个
}
InvokeRepeating("OnGreatMoveHead", 0, Speed);
}
// Update is called once per frame
void Update () {
SnakeVec = SnakeHeadVec();
if (Input.GetKeyDown(KeyCode.K))
{
for (int i = 0; i < SnakeList.Count; i++)
{
SnakeList.RemoveAt(i);
Destroy(SnakeList[i].gameObject,2);
}
}
}
//定义随机生成食物 Quaternion.identity每旋转前的初始角度 指Quaternion(0,0,0,0)
public void OnGreatFood()
{
int i = Random.Range(0,SnakeFood.Length);
Vector3 FoodVec = new Vector3(Random.Range(-10,10),Random.Range(-10,10),-0.5f);
GameObject clone = Instantiate(SnakeFood[i] ,FoodVec ,Quaternion.identity);
clone.GetComponent<Renderer>().material.color = new Color(Random.value ,Random.value ,Random.value ,Random.Range(0.5f,0.8f));
}
//移动函数
private Vector2 SnakeHeadVec()
{
if (Input.GetKeyDown(KeyCode.Q))
{
CancelInvoke("OnGreatMoveHead");
InvokeRepeating("OnGreatMoveHead",0,Speed * 0.1f);
}
if (Input.GetKeyUp(KeyCode.Q))
{
CancelInvoke("OnGreatMoveHead");
InvokeRepeating("OnGreatMoveHead", 0, Speed );
}
if (Input.GetKeyDown(KeyCode.W) && SnakeVec != Vector3.down)
{
SnakeVec = Vector3.up;
transform.localRotation = Quaternion.Euler(0,0,0);
}
else if (Input.GetKeyDown(KeyCode.S) && SnakeVec != Vector3.up)
{
SnakeVec = Vector3.down;
transform.localRotation = Quaternion.Euler(0, 0, -180);
}
else if (Input.GetKeyDown(KeyCode.A) && SnakeVec != Vector3.right)
{
SnakeVec = Vector3.left;
transform.localRotation = Quaternion.Euler(0, 0, 90);
}
else if (Input.GetKeyDown(KeyCode.D) && SnakeVec != Vector3.left)
{
SnakeVec = Vector3.right;
transform.localRotation = Quaternion.Euler(0, 0, -90);
}
return SnakeVec;
}
//产生碰撞,检测碰撞是谁?
private void OnTriggerEnter(Collider other)
{
if (other.tag == "SnakeFood")
{
Destroy(other.gameObject); //删除碰到的物
IsGreat = true; //创建身体
Invoke("OnGreatFood", 0.3f); //延迟0.3f生成
}
else if (other.tag == "SnakeBody")
{
Debug.Log("我是身体,我输出了");
}
else
{
SceneManager.LoadScene("Snake");
}
}
//定义移动/生成身体/存入数组
public void OnGreatMoveHead()
{
//获取初始头的位置
Vector3 HeadVec = transform.position;
if (IsGreat == true) //如果产生碰撞,就开始生成身体
{
Vector3 HeadVector = HeadVec;
GameObject HandClone;
HandClone = Instantiate(SnakeHead ,HeadVector ,Quaternion .identity); //生成身体,赋值
Color HandColor = new Color(Random.value ,Random.value ,Random.value);
HandClone.GetComponent<Renderer>().material.color = HandColor;
//存入数组
SnakeList.Insert(0,HandClone.transform);
IsGreat = false;//这里记得关,否则会一直生成身体
}
else if (SnakeList.Count > 0)
{
SnakeList.Last().position = HeadVec;
SnakeList.Insert(0,SnakeList.Last());
SnakeList.RemoveAt(SnakeList.Count - 1);
}
//transform.Translate(SnakeVec );
transform.position =transform.position + SnakeVec;
}
}
上边代码可以直接套用,基本功能实现;