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
- unity----贪吃蛇详解
- unity day2贪吃蛇
- Unity贪吃蛇
- unity用链表来实现贪吃蛇
- Unity实现简单贪吃蛇
- unity 贪吃蛇作战—1
- unity 贪吃蛇作战—2
- 利用unity 制作贪吃蛇小游戏
- Unity 贪吃蛇2D简易制作(一)
- Unity 贪吃蛇2D简易制作(二)
- 利用unity实现简单的贪吃蛇游戏
- Unity 蛇形移动(经典贪吃蛇方式移动)
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- udp协议基础
- Android 6.0系统音量相关小知识点
- 350. Intersection of Two Arrays II
- POI结构与常用类
- Postgresql窗口函数
- Unity贪吃蛇
- 16位2级流水灯加法器
- JAVA快速排序
- 《Python进行自然语言处理》代码笔记(一):第一章示例
- 动态规划的详细解析(01背包问题)
- JSP内置对象下
- eclipse安装JAVA反编译插件
- PHP性能如何实现全面优化?
- Master code detach volume from VM