【Unity】U3D ARPG游戏制作实例(一)EasyTouch5完整示例
Unity Store中有很多Input相关插件,跟EasyTouch功能相似的也有很多,如果想要做个简单操作的手机项目可以考虑EasyTouch,如果想要在多个平台发布或者支持多种操作、复杂操作的话可以考虑另外一款插件Rewired,这款插件可以识别多种外设(手机、键鼠、手柄、方向盘、乐器等),有机会的话我会在写一片关于Rewired的文章。...
文章目录
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学习笔记目录整理
更多推荐
所有评论(0)