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

您所在的位置:网站首页 u3d游戏制作 【Unity】U3D ARPG游戏制作实例(一)EasyTouch5完整示例

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

2023-10-20 05:23| 来源: 网络整理| 查看: 265

文章目录 EasyTouch如何下载添加基础功能使用摇杆测试代码注册监听方式Update方式 实现物体移动测试建模添加脚本 使用按钮添加按钮修改脚本 更换皮肤插件问题修复C0618告警处理GUIStyle警告5.0.8版本代码Bug 总结

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()); } }

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

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(); // 获取摇杆 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); } } } }

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(); } /// /// 移动方法 /// 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); } } } }

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

使用按钮 添加按钮

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

修改脚本

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(); // 获取摇杆 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); } } }

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(); } /// /// 移动方法 /// 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 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学习笔记目录整理



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3