UNITY自用笔记-虚拟摇杆

在这里插入图片描述

一、 前提准备

1.导入框架
2.新创建个文件夹,放我们的艺术资源(摇杆,背景图等图片)

二、配置UI

创建:
在这里插入图片描述1.joypanel里放脚本

2.touch里用来设置触摸范围
需要注意的是:

透明度 改为0不会吃事件 所以为1
在这里插入图片描述
设置了锚点 左对齐
在这里插入图片描述
3.bk里放摇杆的背景图

4.control里放摇柱

三、UI脚本的实现

知识准备:
1.[RectTransformUtility.ScreenPointToLocalPointInRectangle]鼠标位置转换为UI坐标

public class joystaickpanel : BasePanel
{
	//触摸范围的图片
    private Image imgtouvhrect;
	//摇杆背景的图片
    private Image imgbk;
	//摇杆的图片
    private Image imgcontron;

	//摇杆距离背景中心点的最远距离
    public float maxl = 40.9f;

    void Start()
    {
        //获得对应ui
        imgtouvhrect = GetControl<Image>("imgtouvhrect");
        imgbk = GetControl<Image>("imgbk");
        imgcontron = GetControl<Image>("imgcontron");

		//鼠标抬起 按下 拖拽的监听者 他主要用于控制范围
        UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.PointerDown, PointerDown);
        UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.PointerUp, PointerUp);
        UIManager.Addcustomeventlistener(imgtouvhrect, EventTriggerType.Drag, Drag);
		//开始的时候设置背景图为隐藏的
        imgbk.gameObject.SetActive(false);
    }

    private void PointerDown(BaseEventData data)
    {
        //点下的时候显示
        imgbk.gameObject.SetActive(true);
        //显示在点击屏幕的位置
        Vector2 LocalPos 
    	     RectTransformUtility.ScreenPointToLocalPointInRectangle(imgtouvhrect.rectTransform,
            (data as PointerEventData).position,
            (data as PointerEventData).pressEventCamera,
            out LocalPos);
         //具体设置位置
        imgbk.transform.localPosition = LocalPos;
    }
    private void PointerUp(BaseEventData data)
    {
    	//回到原点
        imgcontron.transform.localPosition = Vector3.zero;
        
        EventCenter.GetInstance().EventTrigger<Vector2>("jostick", Vector2.zero);
    }

    private void Drag(BaseEventData data)
    {
        Vector2 LocalPos;
        //参数
        //你想要改变参数的父对象
        //得到当前屏幕的鼠标位置
        //ui用的摄像机
        //可以得到一个转换来的 相对坐标
        RectTransformUtility.ScreenPointToLocalPointInRectangle(imgbk.rectTransform,
            (data as PointerEventData).position,
            (data as PointerEventData).pressEventCamera,
            out LocalPos);

        //更新位置
        imgcontron.transform.localPosition = LocalPos;
        //设置范围
        if(LocalPos.magnitude>maxl)
        {
            imgcontron.transform.localPosition = LocalPos.normalized * maxl;
        }

        //分发我的摇杆方向
        EventCenter.GetInstance().EventTrigger<Vector2>("jostick", LocalPos.normalized);
    }

}

四、测试

好了现在可以进行测试了

public class test : MonoBehaviour
{
    private Vector3 dir;
    
    void Start()
    {
        EventCenter.GetInstance().AddEventListener<Vector2>("jostick", checkdirchange);
    }

    
    void Update()
    {
        this.transform.Translate(dir*Time.deltaTime, Space.World);
    }

    private void checkdirchange(Vector2 dir)
    {
        this.dir.x = dir.x;
        this.dir.z = dir.y;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值