仿arrow.io之人物控制

人物的控制我想大体上有以下内容:

  • 控制输入(键盘还是虚拟摇杆)
  • 收到输入后能移动人物和发射子弹

控制输入

因为有两套输入设备,键盘(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,我们客户端主程看了,居然说我这是歪门邪道,我表示我很无辜啊。之后洋洋洒洒写了十几行代码也实现了,我怎么感觉这才是歪门邪道呢!现在我依然故我,反正他也不会看见!)
图就不上了,上了也看不到走。
射击也是同理了。不在赘述!
摇杆的没有写,但大体的思路是一样的。等到差不多了,弄到手机上在写吧!

下来打算写人物的属性这块的东西,毕竟属性数据才是灵魂,没有这个我也不知道怎么往下写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值