前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3D中使用Joystick Pack实现摇杆控制

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

作者头像
Vaccae
发布2020-10-27 10:25:35
4.7K0
发布2020-10-27 10:25:35
举报
文章被收录于专栏:微卡智享微卡智享

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为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的代码

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通讯

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PlayerMovement的代码
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档