Unity3D中使用Joystick Pack实现摇杆控制

2020-10-27 10:25:35 浏览数 (1)

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为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的值。这样就可以保证键盘和摇杆都可以操作,当然键盘的优先级更后,当按下键盘方向时,同时操作摇杆是不起作用的。

PlayerMovement的代码

代码语言:javascript复制
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通讯

Unity3D网络通讯(五)--Socket通讯之Udp通讯

Unity3D网络通讯(四)--Socket通讯之Tcp通讯

0 人点赞