Unity2D—利用UGUI纯代码实现简易摇杆

目标:拖动摇杆实现平面物体的移动

一、制作摇杆UI、平面物体
(1)新建画布Canvas,将Canvas的UI缩放模式设置为屏幕大小播放(如不设为该模式则会因界面缩放而导致UI消失)。请添加图片描述
(2)在Canvas下新增图片,名为Bound,源图像设置为圆形图片,作为摇杆外圈。
(3)在Bound下新增图片,名为Center,源图像设置为圆形图片、缩小宽度和高度,作为摇杆外圈。
请添加图片描述
(4)创建空对象,名为Actor,重置坐标并修改Sprite。
请添加图片描述
(5)示例界面
请添加图片描述

二、实现代码
(1)JoyStick.cs //摇杆通用脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;

public struct JoyStickData //结构体——摇杆数据
{
    public Vector2 dir; //移动方向
    public float radius; //移动半径
    public JoyStickData(Vector2 d,float r)
    {
        this.dir = d;
        this.radius = r;
    }
    public Vector2 GetPos()
    {
        return dir*radius;
    }

}
public class JoyStick : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler    //三个接口,点击、抬起、拖拽
{
    public RectTransform bound; //外圈
    public RectTransform center; //内圈
    public float radius; //移动限制的半径

    private JoyStickData HandleEventData(PointerEventData eventData)
    {
        Vector2 dir;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(bound,eventData.position,eventData.pressEventCamera,out dir);
        float r =dir.magnitude;
        dir =dir.normalized;
        r=Mathf.Clamp(r,0,radius);

        return new JoyStickData(dir,r);
    }
    public void OnDrag(PointerEventData eventData)
    {
        var data=HandleEventData(eventData);
        center.localPosition=data.GetPos();
        onJoystickMove(data.dir,data.radius);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        var data=HandleEventData(eventData);
        center.localPosition=data.GetPos();
        onJoystickDown(data.dir,data.radius);
        
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        var data=HandleEventData(eventData);
        center.localPosition=Vector2.zero; //抬起后回到0坐标
        onJoystickUp(data.dir,data.radius);
    }
    public virtual void onJoystickDown(Vector2 V,float R)
    {

    }
    public virtual void onJoystickUp(Vector2 V,float R)
    {
        
    }
    public virtual void onJoystickMove(Vector2 V,float R)
    {
        
    }
}

(2)MoveJoyStick.cs //移动摇杆脚本,继承JoyStick

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveJoyStick : JoyStick 
{
    public ActorController actorController;
    public override void onJoystickDown(Vector2 V, float R)
    {
        actorController.Move(V);
    }
    public override void onJoystickUp(Vector2 V, float R)
    {
        actorController.Move(Vector2.zero);
    }

    public override void onJoystickMove(Vector2 V, float R)
    {
        actorController.Move(V);
    }
}

(3)ActorController.cs //角色控制脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ActorController : MonoBehaviour
{
    private Vector2 moveDir;
    public float moveSpeed;
    public void Move(Vector2 dir)
    {
        moveDir = dir;
        
    }
    private void Update()
    {
        transform.Translate(moveDir * moveSpeed * Time.deltaTime);
    }
}

三、为物体添加脚本
(1)为Bound挂上MoveJoyStick.cs,并为其中变量赋值。请添加图片描述
(2)为ActorController挂上ActorController.cs,并为MoveSpeed赋值。请添加图片描述
运行成功,这样我们就实现了利用UGUI自己手写一个简单的摇杆,欢迎小伙伴们在评论区留言!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Unity2D实现JoyStick摇杆功能的代码示例: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class JoyStick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler { private Image bgImg; private Image joystickImg; private Vector3 inputVector; private void Start() { bgImg = GetComponent<Image>(); joystickImg = transform.GetChild(0).GetComponent<Image>(); } public virtual void OnDrag(PointerEventData ped) { Vector2 pos; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos)) { pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x); pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y); inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1); inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector; joystickImg.rectTransform.anchoredPosition = new Vector3(inputVector.x * (bgImg.rectTransform.sizeDelta.x / 3), inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3)); } } public virtual void OnPointerDown(PointerEventData ped) { OnDrag(ped); } public virtual void OnPointerUp(PointerEventData ped) { inputVector = Vector3.zero; joystickImg.rectTransform.anchoredPosition = Vector3.zero; } public float Horizontal() { if (inputVector.x != 0) return inputVector.x; else return Input.GetAxis("Horizontal"); } public float Vertical() { if (inputVector.z != 0) return inputVector.z; else return Input.GetAxis("Vertical"); } } ``` 这个代码实现了一个简单的JoyStick摇杆功能,可以通过Horizontal()和Vertical()方法获取摇杆的输入值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

憋屈y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值