EasyTouch

EasyTouch是一款用于解决移动端游戏操作的解决方案,它提供了摇杆、按钮等UI,极大的简化了移动端游戏的UI开发。

在这里插入图片描述

如何下载

首先下载EasyTouch包:下载链接:EasyTouch 5.0.8下载
将压缩包解压得到EasyTouch5.unitypackage文件。
EasyTouch5.unitypackage文件拖拽到Unity中
点击Import,导入EasyTouch。
在这里插入图片描述

导入成功后项目中会多出以下文件:
在这里插入图片描述

GameObject菜单中会出现EasyTouch选项。
在这里插入图片描述
至此插件导入就完成了。

添加基础功能

要使用EasyTouch的功能需要先创建GameObject --> EasyTouch --> EasyTouch。
在这里插入图片描述

选中EasyTouch后可以对EasyTouch进行基本设置:
在这里插入图片描述
设置内容如下:
在这里插入图片描述

使用摇杆

首先添加摇杆:
在这里插入图片描述

选中摇杆对象:
在这里插入图片描述

将锚点调整到左下角,再将X、Y的位置设置为100.
在这里插入图片描述

摇杆添加后的效果如下:
在这里插入图片描述

测试代码

EasyTouch操控代码有两种实现方式,分别为注册监听方式以及Update方式。

注册监听方式

在场景中建立空物体,并挂载以下脚本:

using UnityEngine;

public class TestEasyTouch : MonoBehaviour
{
    //定义摇杆组件
    private ETCJoystick moveJoystic;

    private void Start()
    {
        // 获取摇杆
        moveJoystic = ETCInput.GetControlJoystick("MyJoystick");
        // 注册摇杆移动监听
        moveJoystic.onMove.AddListener(JoystickMove);
    }

    /// <summary>
    /// 摇杆移动时执行的方法
    /// </summary>
    public void JoystickMove(Vector2 moveVec)
    {
        Debug.Log("=======" + moveVec.ToString());
    }
}

操作摇杆,控制台输出以下信息:
在这里插入图片描述

Update方式

以上是注册监听的方法,下面是通过Update方法实现:

using UnityEngine;

public class TestEasyTouch : MonoBehaviour
{
    //定义摇杆组件
    private ETCJoystick moveJoystic;

    private void Start()
    {
        // 获取摇杆
        moveJoystic = ETCInput.GetControlJoystick("MyJoystick");
    }

    private void Update()
    {
        // 获取摇杆水平移动值
        float h = moveJoystic.axisX.axisValue;
        // 获取摇杆垂直移动值
        float v = moveJoystic.axisY.axisValue;

        if (h!=0 || v!=0)
        {
            Debug.Log(h + "=======" + v);
        }
    }
}

操作摇杆,控制台输出以下信息:
在这里插入图片描述

实现物体移动

测试建模

第一步:创建一个Plane,再创建一个Cube,将Cube调整到平面上方。
第二步:创建两个Shader和两个Material,分别将两个Material给到两个物体,然后分别选择相应的贴图。

在这里插入图片描述

效果如下:
在这里插入图片描述

添加脚本

在Scripts文件夹下建立一个Character文件夹,定义两个脚本:
在这里插入图片描述
将两个脚本挂载到Cube上(此处暂时用方块模拟游戏人物):
在这里插入图片描述

再给Cube挂载一个Character Controller组件:
在这里插入图片描述
CharacterInputController 代码如下:

using UnityEngine;

namespace ARPGFinish.Character
{
    public class CharacterInputController : MonoBehaviour
    {
        // 定义角色控制器组件
        private CharacterMotor characterMotor;

        // 定义摇杆组件
        private ETCJoystick myJoystick;

        private void Start()
        {
            characterMotor = GetComponent<CharacterMotor>();

            // 获取摇杆
            myJoystick = ETCInput.GetControlJoystick("MyJoystick");
            // 注册摇杆移动监听
            myJoystick.onMove.AddListener(JoystickMove);
        }

        /// <summary>
        /// 摇杆移动时执行的方法
        /// </summary>
        public void JoystickMove(Vector2 moveVec)
        {
            //Debug.Log("=======" + moveVec.ToString());
            // 获取摇杆水平移动值
            float h = moveVec.x;
            // 获取摇杆垂直移动值
            float v = moveVec.y;

            if (h != 0 || v != 0)
            {
                characterMotor.Move(h, v);
            }
        }
    }
}

CharacterMotor 代码如下:

using UnityEngine;

namespace ARPGFinish.Character
{
    /// <summary>
    /// 角色马达
    /// 用于处理角色移动
    /// </summary>
    public class CharacterMotor : MonoBehaviour
    {
        /// <summary>
        /// 移动速度
        /// </summary>
        public float moveSpeed = 5;

        /// <summary>
        /// 转向速度
        /// </summary>
        public float rotationSpeed = 0.5f;

        /// <summary>
        /// 角色控制器
        /// </summary>
        private CharacterController chController;

        private void Start()
        {
            chController = GetComponent<CharacterController>();
        }

        /// <summary>
        /// 移动方法
        /// </summary>
        public void Move(float x, float z)
        {
            if (x != 0 || z != 0)
            {
                // 1转向 前往的方向
                LookAtTarget(new Vector3(x, 0, z));
                // 2向目标运动:核心 调用 内置组件提供的方法【角色控制器的 运动的方法】
                // -1 表示,模拟重力:保证主角贴在地面上,不会飘起来! 
                Vector3 motion = new Vector3(transform.forward.x, -1, transform.forward.z);
                chController.Move(motion * Time.deltaTime * moveSpeed);
            }
        }

        /// <summary>
        /// 转向
        /// 通过Lerp实现转向
        /// </summary>
        private void LookAtTarget(Vector3 target)
        {
            if (target != Vector3.zero)
            {
                Quaternion dir = Quaternion.LookRotation(target);
                transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotationSpeed);
            }
        }
    }
}

运行效果如下:
请添加图片描述

使用按钮

添加按钮

先添加按钮:
在这里插入图片描述
调整一下位置:
在这里插入图片描述

修改脚本

CharacterInputController 代码如下:

using UnityEngine;

namespace ARPGFinish.Character
{

    public class CharacterInputController : MonoBehaviour
    {
        /// <summary>
        /// 角色控制器
        /// </summary>
        private CharacterMotor characterMotor;

        /// <summary>
        /// 摇杆
        /// </summary>
        private ETCJoystick myJoystick;

        /// <summary>
        /// 跳跃按钮
        /// </summary>
        private ETCButton jumpButton;

        /// <summary>
        /// 攻击按钮
        /// </summary>
        private ETCButton attackButton;

        private void Start()
        {
            // 获取角色马达
            characterMotor = GetComponent<CharacterMotor>();

            // 获取摇杆
            myJoystick = ETCInput.GetControlJoystick("MyJoystick");
            // 获取跳跃按钮
            jumpButton = ETCInput.GetControlButton("JumpButton");
            // 获取攻击按钮
            attackButton = ETCInput.GetControlButton("AttackButton");

            // 注册摇杆移动监听
            myJoystick.onMove.AddListener(JoystickMove);
            // 注册摇杆停止移动监听
            myJoystick.onMoveEnd.AddListener(JoystickMoveEnd);
            // 注册跳跃按钮监听
            jumpButton.onDown.AddListener(JumpButtonDown);
            // 注册攻击按钮监听
            attackButton.onDown.AddListener(AttackButtonDown);
        }

        /// <summary>
        /// 摇杆移动时执行的方法
        /// </summary>
        public void JoystickMove(Vector2 moveVec)
        {
            // 获取摇杆水平移动值
            float h = moveVec.x;
            // 获取摇杆垂直移动值
            float v = moveVec.y;

            if (h != 0 || v != 0)
            {
                characterMotor.Move(h, v);
            }
        }

        /// <summary>
        /// 摇杆移动完成时执行的方法
        /// </summary>
        public void JoystickMoveEnd()
        {
            characterMotor.MoveFinish();
        }

        /// <summary>
        /// 按下跳跃按钮时执行的方法
        /// </summary>
        public void JumpButtonDown(string buttonName)
        {
            Debug.Log("JumpButtonDown=======" + buttonName);
            characterMotor.Jump();
        }

        /// <summary>
        /// 按下攻击按钮时执行的方法
        /// </summary>
        public void AttackButtonDown(string buttonName)
        {
            Debug.Log("AttackButtonDown=======" + buttonName);
        }
    }

}

CharacterInputController 代码如下:

using UnityEngine;

namespace ARPGFinish.Character
{
    /// <summary>
    /// 角色马达
    /// 用于处理角色移动
    /// </summary>
    public class CharacterMotor : MonoBehaviour
    {

        /// <summary>
        /// 角色控制器
        /// </summary>
        private CharacterController chController;

        /// <summary>
        /// 移动速度
        /// </summary>
        public float moveSpeed = 5;

        /// <summary>
        /// 转向速度
        /// </summary>
        public float rotationSpeed = 0.5f;

        /// <summary>
        /// 重力
        /// </summary>
        private float gravity = 2;

        /// <summary>
        /// 跳跃速度
        /// </summary>
        public float jumpSpeed = 3;

        /// <summary>
        /// 跳跃时间
        /// </summary>
        public float jumpTime = 0.5f;

        /// <summary>
        /// 累计跳跃时间用来判断是否结束跳跃
        /// </summary>
        public float jumpTimeFlag = 0;

        /// <summary>
        /// 是否移动
        /// </summary>
        private bool isMoving = false;

        /// <summary>
        /// 是否跳跃
        /// </summary>
        private bool isJump = false;

        private void Start()
        {
            //chAnim = GetComponent<CharacterAnimation>();
            chController = GetComponent<CharacterController>();
        }

        /// <summary>
        /// 移动方法
        /// </summary>
        public void Move(float x, float z)
        {
            if (x != 0 || z != 0)
            {
                isMoving = true;
                // 转向 前往的方向
                LookAtTarget(new Vector3(x, 0, z));
            }
        }

        /// <summary>
        /// 转向
        /// 通过Lerp实现转向
        /// </summary>
        private void LookAtTarget(Vector3 target)
        {
            if (target != Vector3.zero)
            {
                Quaternion dir = Quaternion.LookRotation(target);
                transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotationSpeed);
            }
        }

        /// <summary>
        /// 停止移动方法
        /// </summary>
        public void MoveFinish()
        {
            isMoving = false;
        }

        /// <summary>
        /// 角色跳跃
        /// </summary>
        public void Jump()
        {
            isJump = true;
        }

        private void Update()
        {
            if (isMoving)
            {
                chController.Move(transform.forward * moveSpeed * Time.deltaTime);
            }

            // 如果在跳跃状态,并且当前时间没有到达跳跃时间,则持续向上移动如果到达跳跃时间,那么持续下降直到遇到地面
            if (isJump)
            {
                if (jumpTimeFlag < jumpTime)
                {
                    chController.Move(transform.up * jumpSpeed * Time.deltaTime);
                    jumpTimeFlag += Time.deltaTime;
                }
                else if (jumpTime < jumpTimeFlag)
                {
                    chController.Move(transform.up * -gravity * Time.deltaTime);
                }

                if (chController.collisionFlags == CollisionFlags.Below)
                {
                    jumpTimeFlag = 0;
                    isJump = false;
                }
            }
        }
    }
}

运行效果如下:
在这里插入图片描述

更换皮肤

摇杆更换皮肤:
1、 先将png图片放到项目中,并将Texture Type改为Sprite(2D and UI),点击Apply。
在这里插入图片描述
2、 选中摇杆,更改Sprites中的两张图片。
在这里插入图片描述
效果展示:
在这里插入图片描述

按钮皮肤更换:选中相应的按钮,更改Sprites中的两张图片。
在这里插入图片描述
效果展示:
在这里插入图片描述

插件问题修复

C0618告警处理

双击告警信息,进入告警的脚本,在脚本上方加一行代码:

#pragma warning disable 0618

这样就能将告警信息隐藏了。

GUIStyle警告

在场景中添加按钮有时会报如下警告:

Unable to find style 'As TextArea' in skin 'DarkSkin' Layout
UnityEngine.GUIStyle:op_Implicit (string)
ETCGuiTools:BeginGroup (int) (at Assets/Plugin/EasyTouchBundle/EasyTouchControls/Plugins/Editor/ETCGuiTools.cs:35)
ETCButtonInspector:OnInspectorGUI () (at Assets/Plugin/EasyTouchBundle/EasyTouchControls/Plugins/Editor/ETCButtonInspector.cs:49)
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

原因是源码中有一行GUI相关代码,因为版本问题不兼容,代码如下:

EditorGUILayout.BeginHorizontal("As TextArea", GUILayout.MinHeight(10f));

解决方案是双击控制台信息,进入相应的脚本,将该行代码的As TextArea中As去掉即可。
目前我只发现HTGuiTools和ETCGuiTools两个脚本存在此问题。

好像还有其他人使用更改dll的方式,感觉没必要搞那么复杂,暂时用此方法处理。
如果谁有更好的办法麻烦告知一下,先多谢啦!

5.0.8版本代码Bug

在开发的过程中发现获取不到按钮,查看源码发现是一行bug代码,源码在获取按钮时将比对类型写成了摇杆,所以获取不到。
源代码如下:
在这里插入图片描述
将247行代码中的ETCJoystick改成ETCButton就可以了,代码如下:
在这里插入图片描述
这种低级错误也能犯,有点无语。。。

总结

Unity Store中有很多Input相关插件,跟EasyTouch功能相似的也有很多,如果想要做个简单操作的手机项目可以考虑EasyTouch,如果想要在多个平台发布或者支持多种操作、复杂操作的话可以考虑另外一款插件Rewired,这款插件可以识别多种外设(手机、键鼠、手柄、方向盘、乐器等),有机会的话我会在写一片关于Rewired的文章。


更多内容请查看总目录【Unity】Unity学习笔记目录整理

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐