持续创作,加速成长!这是我参与「掘金日新计划 · 6月更文挑战」的第16天,点击查看活动详情
运行效果
开始制作
现在我们开始场景的搭建,
1,调整摄像机属性如下图:
2,创建一个Quad作为背景,将其位置归零,即position(0,0,0),,,大小调整为Scale(61,25,1),,,并且移除身上组件Mech Collider组件,为其附上黑色的材质,,
3,创建一个cube并重名为Snake,注意位置归零,作为出示蛇头,并且为其加上rigidbody 组件并且取消重力属性,把box collider组件的 is Trigger 属性勾选上,作为触发检测使用,
4,创建食物cube重命名为foot 作为食物,附上自己喜欢的材质,,把box collider组件size打小调整为(0.5,0.5,0.5),,为并避免,不在一列蛇就吃到食物,,创建并添加Food标签,,然后把它拖成预制体即可
5,创建一个cube重命名为Body作为生成的蛇尾,,也把box collider组件的size大小调整为(0.5,0.5,0.5),然后也拖拽成预制体
6,最后我们在创建一个游戏边框,作为蛇的活动范围,创建四个空对象,作为Quad的子物体,为其加上box collider组件,,将其摆放到边界即可,,,
搭建如图所示场景:
代码实现
此代码用于动态生成食物,,挂载场景物体上即可(灯光,背景,摄像机)
using UnityEngine;
public class FoodDemo : MonoBehaviour {
public GameObject SSFood; //把食物的预制体赋值
public int xLimit = 30; //游戏边界(最大高度,宽度)
public int yLimit = 22;
// Use this for initialization
void Start () {
//动态生成食物的时间
InvokeRepeating("Food", 1, 5);
}
void Food()
{
//随机生成食物位置
int x = Random.Range(-xLimit, xLimit);
int y = Random.Range(-yLimit, yLimit);
Instantiate(SSFood, new Vector2(x, y), Quaternion.identity);
}
}
挂载到蛇身上:运行游戏就可以玩耍了
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
//蛇的移动脚本
public class Move : MonoBehaviour {
List<Transform> Bodylist = new List<Transform>();
public GameObject Body; //吃到东西添加在后面的物体
public bool ISwith = false; //是否吃到
public float velocitytime = 0.5f; //初始速度
Vector2 direction = Vector2.up; //初始方向,
// Use this for initialization
void Start () {
//第一次调用方法是程序开始0.5秒过后,之后每隔velocitytime秒之后调用一次
InvokeRepeating("MoveSnake",0.5f, velocitytime);
}
// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
direction = Vector2.up;
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
direction = Vector2.left;
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
direction = Vector2.down;
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
direction = Vector2.right;
}
}
#region 移动&&核心算法
void MoveSnake()
{
//每执行一次获取一次头部的位置
Vector3 vpos = transform.position;
//执行移动
transform.Translate(direction);
if (ISwith) //吃到食物
{
//实例化吃到的食物
GameObject Bodyper =(GameObject)Instantiate(Body, vpos, Quaternion.identity);
//添加到list的头部
Bodylist.Insert(0, Bodyper.transform);
ISwith = false;
}
//==============核心算法================
if (Bodylist.Count>0)
{
//最后一个移动到第一个的位置
Bodylist.Last().position = vpos;
//list里面的元素 进行交换位置,,最后一个物体添加到list的最前面
Bodylist.Insert(0, Bodylist.Last());
//移除最后一个,,(因为他已经被加入到第一个的位置了)
Bodylist.RemoveAt(Bodylist.Count - 1);
}
//======================================
}
#endregion
/// <summary>
/// 触发检测
/// </summary>
/// <param name="other">碰到带物体的名字</param>
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Food") //使用标签
{
//销毁食物预制体
Destroy(other.gameObject);
ISwith = true;
}
else //碰到除了food的物体,重新开始游戏
{
SceneManager.LoadScene(0);
}
}
}