学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为2342字,预计阅读6分钟
前言
花了几个小时重新根据Unity3D的初学者教程做了一个简单的Demo,做完后确实对新人来说是个比较不错的学习项目,项目中控制人物移动是用的键盘的方向键,就想如果在手机平台的话,实现摇杆控制方向,类似于王者荣耀那样的效果,所以就顺便学习了Joystick Pack组件。今天这篇就是介绍Joystick Pack的简单使用。
实现效果
上面的视频就是用了Joystick Pack后实现的移动效果,键盘和摇杆可以同时操作,逻辑是一样的。
Joystick Pack
微卡智享
Joystick Pack虚拟操纵杆在Unity的资源商店中可以直接获取,是完全的免费资源,可以直接在Unity3D资源商店中直接获取。
游戏项目
微卡智享
视频中的游戏项目就是在Unity Hub学习目录下的John Lemon`s Haunted Jaunt:3D Beginner。
在Learn.unity.com中找到这个项目后,跟着教程一步一步的创建和操作完成的。
建议初学者都可以都用这个试一下,做完后对整个项目会有一个简单的了解。接下来就是我们这篇的重点了,主要讲Joystick Pack的使用。
Joystick Pack使用
微卡智享
01
Joystick Pack导入
首先要在文章开始的Unity3d的资源商店中把Joystick Pack已经添加到我的资源中。
然后在项目的窗口---包管理器--My Assiets中找到Joystick Pack,把这个包下载并导入。
导入后Assets中就会出现Joystick Pack的文件夹了。
02
布局设置
在我们的Canvas的2D面板中创建一个空物体,改名为Operator(代表控制),然后将右边Joystick Pack--Prefabs--Variable Joystick的预制件拖入到Operator下,另一个btnFinish是一个操作按钮,用于运行中点击退出游戏用的,所以这里可以忽略。
然后点击Variable Joystick在右边的检查器中调整位置及布局,这个可以自己设置位置和大小。
到这里,布局就完成了,接下来就是怎么实现摇杆控制人物移动。
03
代码控制
点击人物后,可以看到右边的检查器中绑定的Player Movement的脚本,这个脚本就是控制人物移动的,双击这个脚本后我们开始进行代码编辑。
增加一个VariableJoystick,属性的public,这样可以外部赋值。
然后在FixedUpdate()的方法里,添加上面的两行代码,这里说明一下,horizontal是水平移动的值,vertical是垂直移动的值,原代码中通过Input.GetAxis的方法获取到键盘移动的值,我们这里的原理是:
当判断horizontal和vertical的值为0时,说明没有按键盘的方向键,这时我们再获取Variable Joystick对应的horizontal和vertical的值。这样就可以保证键盘和摇杆都可以操作,当然键盘的优先级更后,当按下键盘方向时,同时操作摇杆是不起作用的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float turnSpeed = 20f;
public VariableJoystick variableJoystick;
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
Animator m_Animator;
Rigidbody m_Rigidbody;
AudioSource m_AudioSource;
// Start is called before the first frame update
void Start()
{
m_Animator = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
m_AudioSource = GetComponent<AudioSource>();
}
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
//判断如果没有输入再获取摇杆的值
horizontal = horizontal == 0 ? variableJoystick.Horizontal : horizontal;
vertical = vertical == 0 ? variableJoystick.Vertical : vertical;
m_Movement.Set(horizontal, 0f, vertical);
m_Movement.Normalize();
//方法接受两个 float 参数,并返回布尔值;
//如果两个 float 数值大致相等,则返回 true,
//否则返回 false。
bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);
bool hasVerticalINput = !Mathf.Approximately(vertical, 0f);
//根据水平和垂直数值,如果有一个移动就代表着行走
bool isWalking = hasHorizontalInput || hasVerticalINput;
m_Animator.SetBool("IsWalking", isWalking);
if (isWalking)
{
if (!m_AudioSource.isPlaying)
{
m_AudioSource.Play();
}
}
else
{
m_AudioSource.Stop();
}
//RotateTowards 接受四个参数:前两个是 Vector3,分别是旋转时背离和朝向的矢量。
//接下来的两个参数是起始矢量和目标矢量之间的变化量:首先是角度变化(以弧度为单位),然后是大小变化。
Vector3 desiredForward = Vector3.RotateTowards(transform.forward,
m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation(desiredForward);
}
void OnAnimatorMove()
{
//Animator 的 deltaPosition 是由于可以应用于此帧的根运动而导致的位置变化
m_Rigidbody.MovePosition(m_Rigidbody.position +
m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation(m_Rotation);
}
}
04
绑定Joystick Pack
完成上面的代码后,我们把脚本保存,这样上面创建的Variable Joystick就会显示在PlayerMovement的检查器中了。
将Variable Joystick的组件拖到右下角Player Movement中定义的Variable Joystick中就实现绑定。
完成上面的步骤后,Joystick Pack摇杆控制就简单的实现了。
上面的是视频中的动图效果
完
扫描二维码
获取更多精彩
微卡智享
「 往期文章 」
Unity3D网络通讯(六)-- UnityWebRequest实现WebService通讯