【Unity插件】游戏摇杆Joystick

news/2025/3/15 1:11:43/

文章目录

  • 前言
  • 一、Joystick摇杆类型
  • 二、摇杆基本属性
  • 三、摇杆使用方法
  • 四、其他功能及扩展
  • 总结


前言

最近开发很多游戏Demo中都有用到游戏摇杆Joystick。个人还是挺喜欢用这个插件的,很方便。今天在这里简单介绍一下。

一、Joystick摇杆类型

Joystick Pack包含多个不同的虚拟游戏杆,可通过简单的拖放轻松在项目中使用(很适合小游戏开发,轻量级别)。

  • 动态摇杆 Dynamic Joystick

    动态摇杆是识别玩家触摸的地方,从触摸的地方开始,然后随着触摸位置的变化在屏幕上移动。

  • 固定摇杆 Fixed Joystick

    固定摇杆是当你开发时设置好它在场景中的位置,它就保持在固定位置。玩家在游戏中也只能触摸该位置进行控制。

  • 浮动摇杆 Floating Joystick

    浮动摇杆是识别玩家按下的地方,保持固定在该位置,直到释放触摸为止。当玩家再次触摸时,位置会重新调整到玩家按下的位置。

  • 可变摇杆 Variable Joystick

    可变摇杆可以在以上三种模式之间切换。比较适用于游戏中玩家决定使用哪个

二、摇杆基本属性

在这里插入图片描述
以可变摇杆为例

  • 手柄范围 Handle Range:

    从摇杆中心移动到边缘的距离。

  • 盲区 Dead Zone:

    与中心输入保持的距离,在该盲区半径内不响应拖动事件。

  • 轴选项 Axis Options:

    摇杆使用哪个轴,水平或垂直,或者两个轴都有使用。

  • Snap X:

    将输入沿水平轴对齐到整数值。(1、0或-1)

  • Snap Y:

    将输入沿垂直轴对齐到整个值。(1、0或-1)

  • 移动阈值 Move Threshold:

    该属性适用于摇杆类型为动态Dynamic。

    当中心输入开始移动之前,必须与摇杆保持的一定距离。

  • 摇杆类型Joystick Type:

    只可变摇杆有该功能。可以设置当前的摇杆类型。

    例如将摇杆设置为固定模式,代码如下:

    variableJoystick.SetMode(JoystickType.Fixed);
    
  • 背景 Background:

    背景对象上的RectTransform组件。

    可以通过Image组件的Source Image改变摇杆背景的样式。

  • 摇杆 Handle:

    摇杆柄对象上的RectTransform组件。

    可以通过Image组件的Source Image改变摇杆柄的样式。

三、摇杆使用方法

1.将摇杆添加到场景中

找到Joystick Pack下Prefabs文件夹,选择要使用的摇杆并将其拖到场景中。记住哦,它是UI元素,要确保它在画布中。
在这里插入图片描述
在这里插入图片描述

2.编辑脚本:通过摇杆移动目标

可以给目标加上刚体,获取摇杆的横向值和纵向值来确定移动方向,然后给刚体添加对应方向的力让目标动起来。

也可以通过直接控制目标的位置信息来移动目标。


public float moveSpeed;//移动速度
public VariableJoystick variableJoystick;//摇杆
public Rigidbody rb;//刚体private void FixedUpdate()
{//根据摇杆方向设置目标移动的方向Vector3 direction = Vector3.forward * variableJoystick.Vertical + Vector3.right * variableJoystick.Horizontal;//给刚体添加一个力使其向该方向移动rb.AddForce(direction * moveSpeed * Time.fixedDeltaTime, ForceMode.VelocityChange);//或者直接控制目标位置信息来移动目标//base.transform.position += direction * moveSpeed * Time.fixedDeltaTime;
}

3.编辑脚本:通过摇杆来控制目标旋转

public float rotateSpeed;//旋转速度
public VariableJoystick variableJoystick;//摇杆private void FixedUpdate()
{//根据摇杆方向设置目标移动的方向Vector3 direction = Vector3.forward * variableJoystick.Vertical + Vector3.right * variableJoystick.Horizontal;//这里判断移动的数值是否不等于0,保证按下未位移时不做旋转运动(也可以通过设置VariableJoystick的盲区值大于0,比如0.1)if(!Mathf.Approximately(Mathf.Abs(m_VariableJoystick.Vertical), 0.0f) || !Mathf.Approximately(Mathf.Abs(m_VariableJoystick.Horizontal), 0.0f)){//计算角度floatangle = Vector3.Angle(Vector3.forward, direction);//计算角度方向angle *= (Vector3.Dot(Vector3.up, Vector3.Cross(Vector3.forward, direction)) < 0? -1 : 1);//根据角度信息获取旋转信息Quaternion targetQuaternion = Quaternion.Euler(newVector3(0, angle, 0));//利用Quaternion.Slerp对目标旋转进行球形插值计算base.transform.rotation = Quaternion.Slerp(base.transform.rotation, targetQuaternion, Time.fixedDeltaTime * rotateSpeed);}
}

4.将脚本挂载在需要移动的目标上,并设置上对应的信息。
在这里插入图片描述

四、其他功能及扩展

  • 游戏过程中不显示摇杆信息

    很多小游戏中希望玩家操作摇杆时不显示摇杆信息。我们可以通过将组件Background和Handle的Image组件Color的Alpha值设为0。

  • 摇杆是否正在拖拽中

    游戏中有时候我们需要知道摇杆是否正在拖拽中,例如我们希望未拖拽时玩家为待机模式,而拖拽过程中玩家为奔跑移动模式。

找到Joystick.cs脚本,在脚本中添加如下代码:


public bool IsDraging { get; private set; }//获取当前是否拖拽中

找到OnPointerDown函数,添加如下代码:

public virtual void OnPointerDown(PointerEventData eventData)
{OnDrag(eventData);//以下是需要添加的代码IsDraging = true;
}

找到OnPointUp函数,如下添加代码:


public enum PlayerMode
{Idle = 0,Move = 1
}public VariableJoystick variableJoystick;//摇杆
public PlayerMode playerMode = PlayerMode.Idle;
private void FixedUpdate()
{if (variableJoystick.IsDraging){this.playerMode = PlayerMode.Move;}else{this.playerMode = PlayerMode.Idle;}
}
  • 监听摇杆拖拽进行时驱动事件

    在Joystick.cs脚本添加如下代码:

public class OnChangeEvent : UnityEvent<Vector2> { }
[FormerlySerializedAs("OnValueChange")]
[SerializeField]
private OnChangeEvent m_OnValueChanged = new OnChangeEvent(); //事件
public OnChangeEvent OnValueChange
{get { return m_OnValueChanged; }set { m_OnValueChanged = value; }
}private void Update()
{if (IsDraging) //摇杆拖拽进行时驱动事件{m_OnValueChanged.Invoke(Direction);}
}

玩家对应的脚本处注册OnValueChanged 事件监听


public VariableJoystick variableJoystick;//摇杆
private void Start()
{this.variableJoystick.OnValueChange.AddListener(direction => this.OnValueChanged(direction));
}private void OnValueChanged(Vector2 direction)
{//在这里就可以获取偏移量来控制游戏对象运动
}

总结

如果有不懂的可以留言或者私信给我哦~~~

Joystick Pack可以直接在Unity Assets Store中搜索关键字Joystick获取,或者点击下方链接下载:
https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631


http://www.ppmy.cn/news/216840.html

相关文章

操作系统(进程与线程,复习自用)

进程与线程 进程与线程进程的概念、组成、特征进程的状态与转换进程控制进程通信&#xff08;IPC&#xff09;线程概念 多线程模型线程的实现方式 多线程模型线程的状态与转换 CPU调度与上下文切换调度的概念、层次进程调度的时机 切换与过程调度方式调度器 闲逛进程调度算法的…

LeetCode 周赛 348(2023/06/05)数位 DP 模板学会了吗

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问&#xff01; 往期回顾&#xff1a;LeetCode 单周赛第 347 场 二维空间上的 LIS 最长递增子序列问题 周赛 348 概览 T1. 最小化字符串长度&#xff08;Medium&…

索尼g8441是什么版本_复兴之路!索尼新机G8341/G8441现身波兰

虽然说索尼在手机业务方面没有像苹果三星一样顺风顺水&#xff0c;不过好歹索尼也是一个国际大厂。除了今年MWC大会上为消费者带了索尼Xzp等等机型外&#xff0c;还称将会在今年下半年为大家带来更多的旗舰。 目前&#xff0c;根据外媒gsmarena报道&#xff0c;在每年的IFA大会…

Sony索尼XZP(G8142)无GUG开启全局4K显示模式

连接手机&#xff0c;打开ADB&#xff08;ADB安装方法可自行搜索教程&#xff09; 1&#xff1a;输入命令 adb devices 回车键&#xff0c;会显示手机设备编号&#xff0c; 2&#xff1a;再输入 adb shell 回车键&#xff0c;会显示此机器型号 &#xff0c; 3&#xff1a;再…

索尼xzp升级android p,索尼XZ Premium国行正式推送安卓8.0更新!功能大升级

今日&#xff0c;索尼官方宣布&#xff0c;国行Xperia XZ Premium正式开始推送Android 8.0 Oreo更新。具体版本号为47.1.A.8.49&#xff0c;大小1075.3MB。 据悉&#xff0c;此次更新除了众多系统功能升级外&#xff0c;还增强了如下体验&#xff1a; 1、全新3D大师&#xff0c…

xz1推送android9.0,索尼XZ1/XZP港版正式推送Android 9.0更新 搭载4K HDR显示屏

上周索尼XZ1/XZ1 C台版两款手机终于迎来了Android 9.0的更新&#xff0c;在评论区里&#xff0c;有不少小伙伴抱怨港版的XZ1、XZP手机是“后娘养的”&#xff0c;迟迟不给更新。 现在&#xff0c;好消息来了&#xff0c;来自IT之家网友的线索投递&#xff0c;今天索尼Xperia XZ…

Xz1 android p更新,索尼XZ1/XZP港版正式推送Android 9.0更新

原标题&#xff1a;索尼XZ1/XZP港版正式推送Android 9.0更新 IT之家1月29日消息 上周索尼XZ1/XZ1 C台版两款手机终于迎来了Android 9.0的更新&#xff0c;在评论区里&#xff0c;有不少小伙伴抱怨港版的XZ1、XZP手机是“后娘养的”&#xff0c;迟迟不给更新。 现在&#xff0c;…

索尼xzp升级android p,索尼XZP国行版升级安卓8.0 相机功能优化

虽说索尼手机的系统在国内一直遭到用户诟病&#xff0c;体验方面也是不尽如人意&#xff0c;不过在更新上索尼还是十分厚道&#xff0c;一直在为国行系统提供最新的安卓系统体验。索尼官方宣布&#xff0c;国行Xperia XZ Premium正式开始推送Android 8.0 Oreo更新。具体版本号为…