• 【Unity】U3D ARPG游戏制作实例(一)EasyTouch5完整示例



    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);
        }
    
        /// 
        /// 摇杆移动时执行的方法
        /// 
        public void JoystickMove(Vector2 moveVec)
        {
            Debug.Log("=======" + moveVec.ToString());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    实现物体移动

    测试建模

    第一步:创建一个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);
            }
    
            /// 
            /// 摇杆移动时执行的方法
            /// 
            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);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    CharacterMotor 代码如下:

    using UnityEngine;
    
    namespace ARPGFinish.Character
    {
        /// 
        /// 角色马达
        /// 用于处理角色移动
        /// 
        public class CharacterMotor : MonoBehaviour
        {
            /// 
            /// 移动速度
            /// 
            public float moveSpeed = 5;
    
            /// 
            /// 转向速度
            /// 
            public float rotationSpeed = 0.5f;
    
            /// 
            /// 角色控制器
            /// 
            private CharacterController chController;
    
            private void Start()
            {
                chController = GetComponent<CharacterController>();
            }
    
            /// 
            /// 移动方法
            /// 
            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);
                }
            }
    
            /// 
            /// 转向
            /// 通过Lerp实现转向
            /// 
            private void LookAtTarget(Vector3 target)
            {
                if (target != Vector3.zero)
                {
                    Quaternion dir = Quaternion.LookRotation(target);
                    transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotationSpeed);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

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

    使用按钮

    添加按钮

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

    修改脚本

    CharacterInputController 代码如下:

    using UnityEngine;
    
    namespace ARPGFinish.Character
    {
    
        public class CharacterInputController : MonoBehaviour
        {
            /// 
            /// 角色控制器
            /// 
            private CharacterMotor characterMotor;
    
            /// 
            /// 摇杆
            /// 
            private ETCJoystick myJoystick;
    
            /// 
            /// 跳跃按钮
            /// 
            private ETCButton jumpButton;
    
            /// 
            /// 攻击按钮
            /// 
            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);
            }
    
            /// 
            /// 摇杆移动时执行的方法
            /// 
            public void JoystickMove(Vector2 moveVec)
            {
                // 获取摇杆水平移动值
                float h = moveVec.x;
                // 获取摇杆垂直移动值
                float v = moveVec.y;
    
                if (h != 0 || v != 0)
                {
                    characterMotor.Move(h, v);
                }
            }
    
            /// 
            /// 摇杆移动完成时执行的方法
            /// 
            public void JoystickMoveEnd()
            {
                characterMotor.MoveFinish();
            }
    
            /// 
            /// 按下跳跃按钮时执行的方法
            /// 
            public void JumpButtonDown(string buttonName)
            {
                Debug.Log("JumpButtonDown=======" + buttonName);
                characterMotor.Jump();
            }
    
            /// 
            /// 按下攻击按钮时执行的方法
            /// 
            public void AttackButtonDown(string buttonName)
            {
                Debug.Log("AttackButtonDown=======" + buttonName);
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    CharacterInputController 代码如下:

    using UnityEngine;
    
    namespace ARPGFinish.Character
    {
        /// 
        /// 角色马达
        /// 用于处理角色移动
        /// 
        public class CharacterMotor : MonoBehaviour
        {
    
            /// 
            /// 角色控制器
            /// 
            private CharacterController chController;
    
            /// 
            /// 移动速度
            /// 
            public float moveSpeed = 5;
    
            /// 
            /// 转向速度
            /// 
            public float rotationSpeed = 0.5f;
    
            /// 
            /// 重力
            /// 
            private float gravity = 2;
    
            /// 
            /// 跳跃速度
            /// 
            public float jumpSpeed = 3;
    
            /// 
            /// 跳跃时间
            /// 
            public float jumpTime = 0.5f;
    
            /// 
            /// 累计跳跃时间用来判断是否结束跳跃
            /// 
            public float jumpTimeFlag = 0;
    
            /// 
            /// 是否移动
            /// 
            private bool isMoving = false;
    
            /// 
            /// 是否跳跃
            /// 
            private bool isJump = false;
    
            private void Start()
            {
                //chAnim = GetComponent();
                chController = GetComponent<CharacterController>();
            }
    
            /// 
            /// 移动方法
            /// 
            public void Move(float x, float z)
            {
                if (x != 0 || z != 0)
                {
                    isMoving = true;
                    // 转向 前往的方向
                    LookAtTarget(new Vector3(x, 0, z));
                }
            }
    
            /// 
            /// 转向
            /// 通过Lerp实现转向
            /// 
            private void LookAtTarget(Vector3 target)
            {
                if (target != Vector3.zero)
                {
                    Quaternion dir = Quaternion.LookRotation(target);
                    transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotationSpeed);
                }
            }
    
            /// 
            /// 停止移动方法
            /// 
            public void MoveFinish()
            {
                isMoving = false;
            }
    
            /// 
            /// 角色跳跃
            /// 
            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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133

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

    更换皮肤

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

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

    插件问题修复

    C0618告警处理

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

    #pragma warning disable 0618
    
    • 1

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

    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&)
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

    5.0.8版本代码Bug

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

    总结

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


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

  • 相关阅读:
    Spring Cloud Seata 分布式事务学习总结
    java计算机毕业设计-图片展示及购买网站-源程序+mysql+系统+lw文档+远程调试
    Java学习笔记43——函数式接口
    编译安装openssl及安装完openssl后使用 ssh -V 查看依然是旧版openssl原因
    ui设计师简历自我评价的范文(合集)
    SPP-学习笔记
    二叉树的中序遍历
    MAC 配置 Maven
    计算机网络-应用层详解(持续更新中)
    node.js实现结合 RSA 和 AES 加密算法的消息交换加密传输&深入理解 node 中的 crypto 加密模块
  • 原文地址:https://blog.csdn.net/xiaoyaoACi/article/details/126059865