仿arrow.io之人物控制
来源:互联网 发布:淘宝买家秀的福利网站 编辑:程序博客网 时间:2024/06/01 20:08
人物的控制我想大体上有以下内容:
- 控制输入(键盘还是虚拟摇杆)
- 收到输入后能移动人物和发射子弹
控制输入
因为有两套输入设备,键盘(PC上控制)和虚拟摇杆(手机上控制)。让我自然而然地想到了用一个接口文件来规定一下这两套输入设备的共同之处。就是:
- 移动
- 转向
- 射击
所以这个接口文件自然地也有三个接口了:
using System;public interface IInputControl { event Action<UnityEngine.Vector3> onMove; event Action<UnityEngine.Vector3> onRotate; event Action onFire;}
注意到每个接口都是event。那是因为我想把输入控制器作为单独的一个模块来用,我只需要把输入的信息告诉外界即算完成了输入控制器的任务,没必要耦合到别的业务逻辑里。
好的,有了这个接口文件,之后不论有多少个输入设备,只要实现了这个接口,这款游戏就能使用。突然感觉棒棒的!
由于我是在PC上做开发的,所以自然地我要使用键鼠来作为输入设备,实现以上接口做出以下类:
using UnityEngine;using System;using System.Collections;public class KeyboardInput : MonoBehaviour, IInputControl{ public event Action<Vector3> onMove; public event Action<Vector3> onRotate; public event Action onFire; // Use this for initialization void Start() { } // Update is called once per frame void Update() { float x = Input.GetAxis("Horizontal"); float y = Input.GetAxis("Vertical"); Vector3 v = new Vector3(x, 0, y); if (onMove != null) { onMove.Invoke(v); } if (onRotate != null) { onRotate.Invoke(Input.mousePosition); } if(Input.GetMouseButtonDown(0)) { if(null != onFire) { onFire.Invoke(); } } }}
这样就可以按住A/S/W/D键来实现移动了,很纳闷么?没看见代码里对A/S/W/D的按键处理啊。。那是因为在Unity里的Edit -> Project Setting -> Input
规定了这几个按键。
具体使用
行走的具体逻辑代码:
inputCtrl = Camera.main.GetComponent<IInputControl>(); inputCtrl.onMove += OnMove; inputCtrl.onRotate += OnRotate; inputCtrl.onFire += OnFire; chCtrl = GetComponent<CharacterController>();
void OnMove(Vector3 dir) { chCtrl.SimpleMove(dir.normalized * 5.0F); }
旋转的具体逻辑代码:
void OnRotate(Vector3 screenPoint) { Ray ray = Camera.main.ScreenPointToRay(screenPoint); RaycastHit hit; if (Physics.Raycast(ray, out hit, 1 << LayerMask.NameToLayer("Ground"))) { transform.LookAt2D(hit.point); } }
transform.LookAt2D是自己写的一个Transform的拓展方法,作用是物体水平地LookAt,把水平轴X,Z给锁住了,否则人物会歪。
public static void LookAt2D(this Transform self, Vector3 point) { point.y = self.position.y; self.LookAt(point); }
(吐槽下,之前做过一款ARPG的项目,我也是用这种方式实现了人物的LookAt2D,我们客户端主程看了,居然说我这是歪门邪道
,我表示我很无辜啊。之后洋洋洒洒写了十几行代码也实现了,我怎么感觉这才是歪门邪道
呢!现在我依然故我,反正他也不会看见!)
图就不上了,上了也看不到走。
射击也是同理了。不在赘述!
摇杆的没有写,但大体的思路是一样的。等到差不多了,弄到手机上在写吧!
下来打算写人物的属性这块的东西,毕竟属性数据才是灵魂,没有这个我也不知道怎么往下写了。
- 仿arrow.io之人物控制
- 仿arrow.io之地图
- 仿arrow.io之人物属性
- unity3d之鼠标控制人物移动
- RPG黑暗之光(2)人物选择场景搭建、人物选择UI、人物选择控制
- es6之Arrow Function
- Arrow
- 自学unity之人物动画控制(第一篇)
- Unity模拟龙之谷人物行走简单控制
- Unity模拟龙之谷人物控制(二)
- Unity模拟龙之谷人物行走简单控制
- Unity模拟龙之谷人物控制(二)
- KING_UNITY学习之鼠标点击地面控制人物移动
- Unity3D游戏场景之鼠标点击地面控制人物移动
- C++之IO格式控制
- 人物动画的控制
- 第三人称游戏人物控制
- unity简单人物控制
- RobotFramework测试问题一:昵称清空后,仍然显示在页面(Input Text vs. Press Key)
- openssl制作证书全过程
- DefaultActionInvocation类的执行action
- Unity&Shader基础篇—轮廓增强
- Python——List操作
- 仿arrow.io之人物控制
- VM+Lamp环境搭建
- MYSQL常用命令
- SQL删除重复数据方法
- Angularjs开发一些经验总结
- ZOJ2256-Mincost
- Excel拼装Sql语句将数据批量导入数据库
- 绝对定位的盒子如何实现水平垂直居中
- 如何为你的代码选择一个开源协议