在学习了NightmareShooter这款游戏开发案例之后,我打算把它发布到安卓平台,但是原来的案例的安卓平台的角色控制脚本并不满足我的需求,然后,我找到了EasyTouch这款插件。


一、创建按钮

首先,导入EasyTouch插件,然后,在Hierachy上右键点击EasyTouch Controls


EasyTouch一共有几种按钮样式:分别是Joystick,D-Pad,Button,TouchPad,Area

Joystick:可以360度的旋转。

unity gridview插件 unity插件编写_角色控制

D-Pad:只有左右前后。

unity gridview插件 unity插件编写_EasyTouch_02

Button:只能点击一次。

unity gridview插件 unity插件编写_EasyTouch_03

TouchPad:设置一个区域,触摸该区域调用。

unity gridview插件 unity插件编写_unity gridview插件_04

Area:设置你的按钮触摸范围,范围内只会触发按钮而不会触发其他方法,类似于一个遮罩。

unity gridview插件 unity插件编写_unity3d_05


而在该游戏里,我只用到Joystick,其他的按钮其实可以说是大同小异的。



我创建了两个Joystick,左边按钮控制移动,右边控制主角的面向(即射击方向)

unity gridview插件 unity插件编写_角色控制_06



二、按钮的属性修改及功能的添加

1.左边的按钮控制主角的移动

unity gridview插件 unity插件编写_角色控制_07

首先设置它的类型Type是static,即静态的,按钮就不会改变位置。如果设置成动态,该按钮就会出现在你触摸屏幕的位置。

然后设置Anchor为BottomLeft左下,并设置一下大小。


unity gridview插件 unity插件编写_角色控制_08

接着我勾选了Horizontal axis和Vertical axis,分别是按钮的垂直和水平方向。


首先是Horizonal(水平方向)的修改

unity gridview插件 unity插件编写_unity gridview插件_09

Inverted axis:反方向翻转

Dead lenght:触摸位置离开按钮多远按钮停止触发

On/Off Threshold:不清楚什么功能,故不做讨论

Speed:速度


unity gridview插件 unity插件编写_EasyTouch_10


Action on 为Press(按压方式触发)

Direct action to选择你所要控制的物体,这里我控制的是主角Player。

Action这里有几种选项:

分别是控制旋转(围绕世界坐标),控制旋转(围绕本地坐标),控制移动(世界坐标),控制移动(本地坐标),控制大小,添加一个方向的力,添加一个方向的力(相对的),添加一个扭力,添加一个扭力(相对的)。

在这里控制的是主角的移动,所以我选择了Translate



unity gridview插件 unity插件编写_unity3d_11

Affected axis 指的是控制那个坐标

我这里选择的是x,即控制主角x轴的移动


unity gridview插件 unity插件编写_实例_12

Enable inertia:是否具有惯性

Positive key:正方向的控制按键

Negative key:反方向的控制按键

这里我是左右移动



然后是Vertical(垂直方向)的修改

unity gridview插件 unity插件编写_unity3d_13

Affected axis选择控制z轴的移动


Positive key选择上方向

Negative key选择下方向

这里控制上下方向的移动

其他选项设置与水平方向相同





unity gridview插件 unity插件编写_unity gridview插件_14

Sprites设置的是按钮的贴图,EasyTouch有自带的贴图,你也可以选择其他贴图



unity gridview插件 unity插件编写_EasyTouch_15

再往下看可以看到四种事件,分别是:

Move Events:移动事件

Touch Events:触摸事件

Down Events:按钮按下事件

Press Events:按钮按压事件

在这里我仅仅使用了MoveEvents,其他三种有什么不同不清楚,仅仅看字面上的意思感觉一样呢


unity gridview插件 unity插件编写_角色控制_16

我设置了移动开始和移动结束的事件

unity gridview插件 unity插件编写_EasyTouch_17

分别对应的是角色的行走动画,和行走动画停止。


该按钮功能实现完成,完成结果:

unity gridview插件 unity插件编写_实例_18




2.右边的按钮控制主角的转向

unity gridview插件 unity插件编写_unity3d_19

设置Anchor为Bottom Right(右下)

unity gridview插件 unity插件编写_EasyTouch_20

勾选垂直和水平方向,但是Direct action to不选择。

只需要用到它的按钮的旋转,并不用它来控制主角


然后在该按钮下的Thumb物体上绑定一个脚本,该物体就是按钮上旋转的物体

脚本里输入以下代码:Player设置为主角


public GameObject Player;

    // Update is called once per frame
    void Update()
    {
        if (GetComponent<RectTransform>().localPosition == new Vector3(0, 0, 0)) 
        {
            return;
        }
        //西
        if (GetComponent<RectTransform>().localPosition.x < 0 && GetComponent<RectTransform>().localPosition.y >= -10 && GetComponent<RectTransform>().localPosition.y <= 10) 
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x - 10, Player.transform.position.y, Player.transform.position.z));
            //Debug.Log("e");
        }
        //东
        if (GetComponent<RectTransform>().localPosition.x > 0 && GetComponent<RectTransform>().localPosition.y >= -10 && GetComponent<RectTransform>().localPosition.y <= 10)
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x + 10, Player.transform.position.y, Player.transform.position.z));
            //Debug.Log("w");
        }
        //南
        if (GetComponent<RectTransform>().localPosition.y < 0 && GetComponent<RectTransform>().localPosition.x >= -10 && GetComponent<RectTransform>().localPosition.x <= 10)
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x, Player.transform.position.y, Player.transform.position.z - 10));
            //Debug.Log("s");
        }
        //北
        if(GetComponent<RectTransform>().localPosition.y > 0 && GetComponent<RectTransform>().localPosition.x >= -10 && GetComponent<RectTransform>().localPosition.x <= 10)
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x, Player.transform.position.y, Player.transform.position.z + 10));
            //Debug.Log("n");
        }
        
        //东北
        if (GetComponent<RectTransform>().localPosition.y > 10 && GetComponent<RectTransform>().localPosition.x > 10) 
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x + 10, Player.transform.position.y, Player.transform.position.z + 10));
            //Debug.Log("wn");
        }
        //西北
        if (GetComponent<RectTransform>().localPosition.y > 10 && GetComponent<RectTransform>().localPosition.x < -10) 
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x - 10, Player.transform.position.y, Player.transform.position.z + 10));
            //Debug.Log("en");
        }
        //东南
        if (GetComponent<RectTransform>().localPosition.y < -10 && GetComponent<RectTransform>().localPosition.x > 10)
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x + 10, Player.transform.position.y, Player.transform.position.z - 10));
            //Debug.Log("ws");
        }
        //西南
        if (GetComponent<RectTransform>().localPosition.x < -10 && GetComponent<RectTransform>().localPosition.y < -10)
        {
            Player.transform.LookAt(new Vector3(Player.transform.position.x - 10, Player.transform.position.y, Player.transform.position.z - 10));
            //Debug.Log("es");
        }
        
    }


在该游戏里我仅仅控制主角的8个方向,并分别通过按钮的旋转位置控制主角的朝向位置。

最后实现结果为:

unity gridview插件 unity插件编写_实例_21