主要视图
Materials
Prefabs
Scenes
Scripts
Texture
关键代码
FoodSnake
public class FoodSnake : MonoBehaviour {
//定义预置体,方便实例化
public GameObject foodSanke;
//公开食物生成位置
public int xLimit = 30;
public int yLimit = 22;
void Start () {
//调用方法的函数
InvokeRepeating("CreateFood",1,3);
}
void Update () {
}
void CreateFood() {
//实例化食物 游戏对象的自身方法
// GameObject.Instantiate(foodSanke,new Vector2(1,1),Quaternion.identity);
//让位置随机 x=61 y=45;
//GameObject.Instantiate(foodSanke,new Vector2(Random.Range(-30,30),Random.Range(-22,22)),Quaternion.identity);
//方便修改食物生成范围,将位置公开
GameObject.Instantiate(foodSanke,new Vector2(Random.Range(-xLimit,xLimit),Random.Range(-yLimit,yLimit)),Quaternion.identity);
}
}
MoveSnake
using UnityEngine;
using System.Collections;
using System.Collections.Generic;//引用 泛型集合 命名空间
using System.Linq;//引用,命名空间
using UnityEngine.SceneManagement;//转换场景需要的引用
public class MoveSnake : MonoBehaviour {
//定义一个transform类型的变量
private Transform m_Transform;
//定义一个开始的方向 默认向上移动
Vector2 direction = Vector2.up;
//定义一个公开的速度 为之后游戏速度改变做准备
public float velocitytime = 0.5f;
//定义一个公开的body变量,用来存放cube body预置体
public GameObject body;
//定义一个开关,用来检测食物
private bool Open = false;
//将蛇身存入一个集合里去 定义集合 的变量
List<Transform> snakeBody = new List<Transform>();
void Start () {
//赋值
m_Transform=gameObject.GetComponent<Transform>();
//重复调用方法的函数
//InvokeRepeating("Move",0.5f,0.5f);//参数1:移动的方法 参数2:第一次调用的时间 参数3:以后每个0.5f秒调用一次;
InvokeRepeating("Move", 0.5f, velocitytime);
}
void Update () {
//控制方向
if (Input.GetKey(KeyCode.A))
{
direction = Vector2.left;
}
if (Input.GetKey(KeyCode.D))
{
direction = Vector2.right;
}
if (Input.GetKey(KeyCode.W))
{
direction = Vector2.up;
}
if (Input.GetKey(KeyCode.S))
{
direction = Vector2.down;
}
}
/// <summary>
/// 移动的方法
/// </summary>
void Move() {
//在移动过程中,判断开关是否打开,打开就创建蛇身;(实例化)位置为本次蛇头的位置
Vector3 VPosition = m_Transform.position; //先执行这一句,保存起来位置,再执行下一句,让它移动
//默认向上移动
m_Transform.Translate(direction);
if (Open)
{
//实例化 蛇身
// GameObject.Instantiate(body,VPosition,Quaternion.identity);
//把实例化的蛇身存起来;
GameObject bodyYuzhi = GameObject.Instantiate(body,VPosition,Quaternion.identity) as GameObject;
//集合插入方法 吃掉食物后在定义的蛇身集合0 号位前面插入实例化后的蛇身
snakeBody.Insert(0,bodyYuzhi.transform);
//检查是否插入成功
// Debug.Log(snakeBody.Count);
//实力一次之后把开关 关掉
// Open = false;
Open = !Open;
}else if (snakeBody.Count > 0)//判断集合里有元素(蛇身)的话 将蛇身跟随蛇头移动的方法
{
//蛇身的位置等于蛇头的位置
snakeBody.Last().position = VPosition;
// Debug.Log(snakeBody.Last().position);
//把最后一个位置从零号位插入;
snakeBody.Insert(0, snakeBody.Last());
//把最后一个元素删除掉;
snakeBody.RemoveAt(snakeBody.Count - 1);//参数:表示固定的下标移除元素;
}
}
//没有刚体 又想触发事件 有两个碰撞器前提下,将蛇改成触发器,添加刚体,不使用重力
//食物是碰撞体就行 ,并且将碰撞体的size改成0.5,否则侧面也会吃掉食物的;
//蛇在移动过程中,检测下触发了谁,就让说消失 把食物的便签改成Food;
/// <summary>
/// 检测触发方法
/// </summary>
/// <param name="coll">触发的对象</param>
void OnTriggerEnter(Collider coll) {
if (coll.gameObject.tag == "Food")
{
//触发食物,将开关打开;
// Open = true;
Open = !Open;
//销毁食物
Destroy(coll.gameObject);
}
else {
//如果不是触发食物,触发其他物体,游戏结束;
//切换场景
// SceneManager.LoadScene(0);//场景管理,加载到另一场景 场景就是设置的第一个 在边框加上4个碰撞器 触发其他即游戏重新开始;
//切换第二场景
SceneManager.LoadScene(0);
}
}
}
StartUI
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;//场景管理命名空间
public class StartUI : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
//点击回到第一个场景;
SceneManager.LoadScene(1);
}
}
}
网友评论