Unity贪吃蛇

来源:互联网 发布:stc单片机引脚 编辑:程序博客网 时间:2024/05/16 13:51

贪吃蛇游戏思路

1.搭建简单场景
2.实现Body的行走
3.实现吃Food增加Body的长度,碰到外墙结束游戏

  • 难点
  • 身体不能反向行走
  • 身体的增加,我的解决办法是每次实例化出来的body永远在蛇头后的第一节

第一步:搭建简易场景

这也是结束之后的效果
这里写图片描述

第二步: 实现Body的移动

通过wasd键控制蛇的前后左右移动,且不能反向移动。

public enum Head{    up,    down,    right,    left}public class move : MonoBehaviour {    public float SpeedTime;    public Head _nextOri;//下一次方向    public Head _currtOri;//当前方向    // Use this for initialization    void Start () {        SpeedTime = 0;        _currtOri = Head.up;        _nextOri = Head.up;    }    // Update is called once per frame    void Update () {        Ture();        MoveTo();    }    void MoveTo()    {        //当按下W键时蛇头方向是向上        //如果当前的方向是向下,那么下次方向不变        if (Input.GetKeyDown(KeyCode.W))        {            _nextOri = Head.up;            if (_currtOri ==Head.down )            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.A))        {            _nextOri = Head.left ;            if (_currtOri == Head.right)            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.D))        {            _nextOri = Head.right ;            if (_currtOri == Head.left )            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.S))        {            _nextOri = Head.down ;            if (_currtOri == Head.up)            {                _nextOri = _currtOri;            }        }    }    void Ture()    {        SpeedTime += Time .deltaTime ;        if (SpeedTime > 0.8/5)        {            transform.Translate(Vector3.forward*0.2f);            SpeedTime = 0;        }        switch (_nextOri)        {            case Head.up:                transform.forward = Vector3.forward;//满足条件向上:当前物体向上移动                _currtOri = Head.up;//记录当前方向                break;            case Head.down:                transform.forward = Vector3.back;                _currtOri = Head.down;                break;            case Head.right:                transform.forward = Vector3.right ;                _currtOri = Head.right;                break;            case Head.left:                transform.forward = Vector3.left;                _currtOri = Head.left;                break;            default:                break;        }    }}

实现吃Food增加Body的长度

这是body 上的代码

using System.Collections;using System.Collections.Generic;using UnityEngine;public enum Head{    up,    down,    right,    left}public class move : MonoBehaviour {    public float SpeedTime;    public Head _nextOri;//下一次方向    public Head _currtOri;//当前方向    public GameObject food;    public GameObject body;    public GameObject _fsBody;    public GameObject _lastBody;    public bool isOver;    // Use this for initialization    void Start () {        SpeedTime = 0;        _currtOri = Head.up;        _nextOri = Head.up;        Food();    }    // Update is called once per frame    void Update () {        Ture();        MoveTo();    }    void creatBody()    {        GameObject obj = Instantiate(body, new Vector3(1000, 1000, 1000), Quaternion.identity);        if (_fsBody==null)        {            _fsBody = obj;        }        if (_lastBody !=null )        {            _lastBody.GetComponent<bodyCtl>()._nextBody = obj;        }        _lastBody = obj;    }    void OnTriggerEnter(Collider other)    {        if (other.tag .Equals("Tag"))        {            isOver = true;        }        if (other.tag.Equals("food"))        {            Destroy(other.gameObject);            Food();            creatBody();        }    }    void Food()    {        float x = Random.Range(-13.5f, 13.5f);        float z = Random.Range(-13.5f, 13.5f);        Instantiate(food, new Vector3(x, 0.5f, z), Quaternion.identity);    }    void MoveTo()    {        //当按下W键时蛇头方向是向上        //如果当前的方向是向下,那么下次方向不变        if (Input.GetKeyDown(KeyCode.W))        {            _nextOri = Head.up;            if (_currtOri ==Head.down )            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.A))        {            _nextOri = Head.left ;            if (_currtOri == Head.right)            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.D))        {            _nextOri = Head.right ;            if (_currtOri == Head.left )            {                _nextOri = _currtOri;            }        }        if (Input.GetKeyDown(KeyCode.S))        {            _nextOri = Head.down ;            if (_currtOri == Head.up)            {                _nextOri = _currtOri;            }        }    }    void Ture()    {        SpeedTime += Time .deltaTime ;        if (SpeedTime > 0.3f)        {            transform.Translate(Vector3.forward*0.3f);            SpeedTime = 0;            //蛇移动前记录当前位置            Vector3 headPos = transform.position;            transform.Translate(Vector3.forward*0.6f);            if (_fsBody !=null )            {                _fsBody.GetComponent<bodyCtl>().bodyMove(headPos);            }        }        switch (_nextOri)        {            case Head.up:                transform.forward = Vector3.forward;//满足条件向上:当前物体向上移动,自身坐标转世界坐标                _currtOri = Head.up;//记录当前方向                break;            case Head.down:                transform.forward = Vector3.back;                _currtOri = Head.down;                break;            case Head.right:                transform.forward = Vector3.right ;                _currtOri = Head.right;                break;            case Head.left:                transform.forward = Vector3.left;                _currtOri = Head.left;                break;            default:                break;        }    }}

接下来是预制物body上的代码

using System.Collections;using System.Collections.Generic;using UnityEngine;public class bodyCtl : MonoBehaviour {    public GameObject _nextBody;    public void bodyMove(Vector3 pos)    {        Vector3 nextpos = transform.position;        transform.position = pos;        if (_nextBody != null)        {            _nextBody.GetComponent<bodyCtl>().bodyMove(nextpos);        }    }}
0 0
原创粉丝点击