好久没有写博客今天更新一篇类似于飞机大战的游戏制作,先看一下游戏的截图。
游戏基本还原了消灭病毒游戏功能,游戏总共有16种病毒分别为:吸附病毒,碰撞病毒,治疗病毒,飞镖病毒,防御病毒,放大缩小病毒,爆炸病毒,快速病毒,启动病毒,普通病毒,自身恢复病毒,减速病毒,吞噬病毒,三分病毒,追踪病毒,吸血病毒。
病毒截图如下:
首先编写飞机玩家的控制代码我们将其命名为VirusPlayerMove。
private void TouchMoveUpdate() { if (Input.GetMouseButtonDown(0)) { Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Collider2D col = Physics2D.OverlapPoint(pos, 1 << LayerMask.NameToLayer("Player")); if (col != null) { _isTouchOn = true; } } if (Input.GetMouseButtonUp(0)) { _isTouchOn = false; } if (Input.GetMouseButton(0)) { if (_isTouchOn) { Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position = Vector3.Lerp(transform.position, pos, Time.deltaTime * 10); if (transform.position.x > 4.8f) transform.position = new Vector3(4.8f, transform.position.y, 0); if (transform.position.x < -4.8f) transform.position = new Vector3(-4.8f, transform.position.y, 0); if (transform.position.y > 9f) transform.position = new Vector3(transform.position.x, 9, 0); if (transform.position.y < -8f) transform.position = new Vector3(transform.position.x, -8, 0); } } }上面就是一个简单的鼠标或者单个手指移动玩家飞机移动。首先判断鼠标或者手指按下的时候通过一个Physics2D.OverlapPoint来检测鼠标是否在飞机所在的一个碰撞器内。如果在说明鼠标或者手指按到了飞机,然后就是在手指移动或者鼠标移动的时候通过一个插值来移动飞机同时限制他跑出去屏幕外面,4.8,-4.8,9,-8就是四个边界,鼠标或者手指控制写完之后,然后再写一个键盘控制。就是简单左右上下按键来控制移动。首先定义四个方向的bool值,
private bool _isLeft; private bool _isRight; private bool _isUp; private bool _isDown;然后就是一个移动的方法:
private void MoveUpdate() { Vector3 pos = transform.position; float xdelta = xmoveSpeed * Time.deltaTime * _multiplier; float ydelta = ymoveSpeed * Time.deltaTime * _multiplier; if (_isRight) { transform.position += new Vector3(xdelta, 0, 0); if (transform.position.x > 4.8f) { transform.position = new Vector3(4.8f, transform.position.y, 0); } } if (_isLeft) { transform.position += new Vector3(-xdelta, 0, 0); if (transform.position.x < -4.8f) { transform.position = new Vector3(-4.8f, transform.position.y, 0); } } if (_isUp) { transform.position += new Vector3(0, ydelta, 0); if (transform.position.y > 9f) { transform.position = new Vector3(transform.position.x, 9, 0); } } if (_isDown) { transform.position += new Vector3(0, -ydelta, 0); if (transform.position.y < -8f) { transform.position = new Vector3(transform.position.x, -8, 0); } } Vector3 d = transform.position - pos; if (Mathf.Abs(d.x) > 0.01f || Mathf.Abs(d.y) > 0.01f) { MoveDirection = d; } }然后将xmoveSpeed和ymoveSpeed定义一下同时在面板上面可以看到
[SerializeField] private float xmoveSpeed; [SerializeField] private float ymoveSpeed;接下来就是当键盘左键按下的时候isLeft = true 右键按下的时候isRight=true,下键按下的时候isDown=true,上键按下的时候isUp=true。
if (Input.GetKeyDown(KeyCode.LeftArrow)) { _isLeft = true; //EventManager.TriggerEvent(new FirstByteClick1DownEvent()); }当然可以按照上面的代码依次可以将后面的几个按键写下去,但是仔细看 _isLeft = true;下面有一行注释的代码,这个消息处理在我之前的博客中有提及到。如果用了消息处理的话,那么_isLeft = true应该在消息处理里面方法里面,至于为什么要这样写呢其实是方便了一些外设来控制(例如街机里面的一些串口通信(街机上的摇杆或者按键),手柄及其他的外设)所以整个控制流程应该是
private void ClickKeyUpdate() { if (Input.GetKeyDown(KeyCode.LeftArrow)) { EventManager.TriggerEvent(new FirstByteClick1DownEvent()); } if (Input.GetKeyUp(KeyCode.LeftArrow)) { EventManager.TriggerEvent(new FirstByteClick1UpEvent()); } if (Input.GetKeyDown(KeyCode.RightArrow)) { EventManager.TriggerEvent(new FirstByteClick2DownEvent()); } if (Input.GetKeyUp(KeyCode.RightArrow)) { EventManager.TriggerEvent(new FirstByteClick2UpEvent()); } if (Input.GetKeyDown(KeyCode.UpArrow)) { EventManager.TriggerEvent(new FirstByteClick3DownEvent()); } if (Input.GetKeyUp(KeyCode.UpArrow)) { EventManager.TriggerEvent(new FirstByteClick3UpEvent()); } if (Input.GetKeyDown(KeyCode.DownArrow)) { EventManager.TriggerEvent(new FirstByteClick4DownEvent()); } if (Input.GetKeyUp(KeyCode.DownArrow)) { EventManager.TriggerEvent(new FirstByteClick4UpEvent()); } }然后同时会注册一些这些按键的事件:
#region Events public void OnEvent(FirstByteClick1DownEvent eventType) { _isLeft = true; } public void OnEvent(FirstByteClick2DownEvent eventType) { _isRight = true; } public void OnEvent(FirstByteClick3DownEvent eventType) { _isUp = true; } public void OnEvent(FirstByteClick4DownEvent eventType) { _isDown = true; } public void OnEvent(FirstByteClick1UpEvent eventType) { _isLeft = false; } public void OnEvent(FirstByteClick2UpEvent eventType) { _isRight = false; } public void OnEvent(FirstByteClick3UpEvent eventType) { _isUp = false; } public void OnEvent(FirstByteClick4UpEvent eventType) { _isDown = false; } #endregion上面是消息处理接下来就是注册和销毁事件:
private void OnEnable() { EventRegister.EventStartListening<FirstByteClick1DownEvent>(this); EventRegister.EventStartListening<FirstByteClick2DownEvent>(this); EventRegister.EventStartListening<FirstByteClick3DownEvent>(this); EventRegister.EventStartListening<FirstByteClick4DownEvent>(this); EventRegister.EventStartListening<FirstByteClick1UpEvent>(this); EventRegister.EventStartListening<FirstByteClick2UpEvent>(this); EventRegister.EventStartListening<FirstByteClick3UpEvent>(this); EventRegister.EventStartListening<FirstByteClick4UpEvent>(this); } private void OnDisable() { EventRegister.EventStopListening<FirstByteClick1DownEvent>(this); EventRegister.EventStopListening<FirstByteClick2DownEvent>(this); EventRegister.EventStopListening<FirstByteClick3DownEvent>(this); EventRegister.EventStopListening<FirstByteClick4DownEvent>(this); EventRegister.EventStopListening<FirstByteClick1UpEvent>(this); EventRegister.EventStopListening<FirstByteClick2UpEvent>(this); EventRegister.EventStopListening<FirstByteClick3UpEvent>(this); EventRegister.EventStopListening<FirstByteClick4UpEvent>(this); }然后该控制类则需要继承这样的几个接口:
public class VirusPlayerMove : MonoBehaviour, IEventListener<FirstByteClick1DownEvent>, IEventListener<FirstByteClick2DownEvent>, IEventListener<FirstByteClick3DownEvent>, IEventListener<FirstByteClick4DownEvent>, IEventListener<FirstByteClick1UpEvent>, IEventListener<FirstByteClick2UpEvent>, IEventListener<FirstByteClick3UpEvent>, IEventListener<FirstByteClick4UpEvent>这个类还有一个功能就是当玩家被减速病毒牵引住的时候这个时候玩家操控的速度会明显的降低。所以这个_multiplier这个值会有所变化。
private void MultiplierUpdate() { float delta = Time.deltaTime * 10; if (_isSlowDown) { _multiplier -= delta; if (_multiplier < 0.4f) { _multiplier = 0.4f; } } else { _multiplier += delta; if (_multiplier >= 1) { _multiplier = 1; } } }所以整个类基本就写完了,等所有玩家控制写完之后 代码我会上传。如果有什么疑问QQ:1850761495