unity 固定摇杆

unity 固定摇杆


实现原理

  • 固定的摇杆:
    • 其实就是围绕一个固定点绕其旋转
    • 这里需要计算一个向量 (Vector2) ,圆点到摇杆的方向,通过这个向量就可以得到摇杆左右朝向信息
    • 向量相减就能得到一个指向被减向量的新向量tmpDir = targetPos - orginPos,如👇 图 其中:
      • orginPos :固定原点
      • targetPos :摇杆原点
      • tmpDir :算出的向量

pic1

  • 然后限制摇杆活动范围,其实就是算出tmpDir这个向量的大小也叫模长,用勾股定理可以得到,当然也可以用unity提供的实例函数magnitude得到 (其实magnitude == Vector2.Distance() )。然后让tmpDir向量的大小距离 <= 一个固定范围radius
    • 当摇杆位置小于这个范围时,就把直接把这个位置设为摇杆位置

pic2
+ 当摇杆位置大于这个范围时,就要先把tmpDir给归一化变成单位向量只关心方向,然后乘以范围得出固定长度,最后加上原点向量得到最后的位置 如👇图

pic3

  • 摇杆状态
    • 待机
    • 按下 IPointerDownHandler - - unity提供的接口可以返回一个以屏幕坐标系为坐标的点(vector2) 仅对UI有效
    • 拖拽 IDragHandler - - 拖拽时就设置摇杆位置
    • 抬起 IPointerUpHandler - - 摇杆回到原点也就是待机时的位置
    • 待机

实现

  • 创建摇杆背景和摇杆(父子关系)编写脚本并挂载到摇杆上
    pic4
using UnityEngine;
using UnityEngine.EventSystems;

public class FixedJoystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler {

	public float Angle { get { return angle; } }
    public Vector2 Direction { get { return direction; } }
    public static FixedJoystick Instance;
    [SerializeField] float radius;
    
    Vector2 orginPos;
    Vector2 direction;
    float distance;
    float power;
    float angle;
    
    private void Start () {
        orginPos = transform.GetComponentInParent<Transform> ().position;
        Instance = this;
        distance = radius;
    }

    public void OnPointerDown (PointerEventData eventData) {
        transform.position = eventData.position;
    }

    public void OnDrag (PointerEventData eventData) {

        Vector2 tmpDir = eventData.position - orginPos; //朝向

        if (tmpDir.magnitude < distance) { //小于最大距离就在 距离内活动
            transform.position = eventData.position;
            power = tmpDir.magnitude / distance;

        } else { //否则 限制最大活动范围
            transform.position = orginPos + tmpDir.normalized * distance;
            power = distance / distance;
        }
        direction.x = tmpDir.x > 0 ? 1 : -1;
        direction.y = tmpDir.y > 0 ? 1 : -1;
        direction *= power;
        //反切计算角度
        angle = Mathf.Atan2 (tmpDir.y, tmpDir.x) * Mathf.Rad2Deg;
    }
    //抬起归原点
    public void OnPointerUp (PointerEventData eventData) {
        transform.localPosition = Vector2.zero;
        direction = Vector2.zero;
    }
}

效果图

  • 需要方向用:FixedJoystick.Instance.Direction
  • 需要角度用:FixedJoystick.Instance.Angle
    pic5

最后

学习笔记,仅供参考,如有不正,欢迎指正

unity手写摇杆是指使用Unity引擎自己编写代码实现的摇杆功能,而非使用插件或库来实现。常见的Unity摇杆插件包括EasyTouch、Joystick Pack、TouchScript等。 这些插件可以方便地添加和配置摇杆功能,省去了手写代码的麻烦。 如果你想手写一个简单的Unity摇杆,可以按照以下步骤进行: 1. 创建一个空物体,命名为"Joystick",用于表示摇杆。在该物体下创建一个UI Image组件,用于显示摇杆的贴图。 2. 在"Joystick"物体上添加一个脚本,命名为"JoystickController",用于控制摇杆的行为。 3. 在"JoystickController"脚本中,定义两个公有变量:一个表示摇杆的半径,一个表示摇杆的灵敏度。 4. 在"JoystickController"脚本的Update函数中,检测玩家的输入(例如手机触摸)并计算摇杆的位置。 5. 根据摇杆的位置,计算玩家的移动方向和速度,并将其应用到游戏对象上。 6. 如果需要,可以添加额外的功能,例如限制摇杆的移动范围或者增加摇杆的回弹效果。 这只是一个简单的手写摇杆实现方法,具体的代码实现需要根据你的游戏需求进行调整。如果想了解更多关于Unity手写摇杆的实现方法和代码示例,你可以参考相关的教程和代码库,例如GitHub上的开源项目。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [[Unity实战]一个简单的unity手写摇杆[入门级][手写demo][开箱可用]](https://blog.csdn.net/aaaadong/article/details/123667896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [unity程序员转Laya入门(5) 纯手写一个摇杆joystick](https://blog.csdn.net/chenggong2dm/article/details/113877355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值