文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Unity实现简单摇杆的制作

2024-04-02 19:55

关注

利用UGUI制作一个简单摇杆,效果图

1、首先建立两个Image,然后将其中一个为父物体,另一个为子物体,并且调整好大小:

ps:将子物体的锚点设置为居中          

2、在父物体上写个JoyStick.cs脚本:

  


using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
public class JoyStick : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler
{
    public static float h, v;  //传出hv
    public float maxDis;    //最大距离
 
    private RectTransform childRectTrans;
    private Coroutine coroutine = null;
 
    void Start()
    {
        childRectTrans = transform.GetChild(0) as RectTransform;
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        if (coroutine != null)
        {
            StopCoroutine(coroutine);
            coroutine = null;
        }
    }
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 outPos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
        {
            childRectTrans.position = outPos;
 
            //限制拖拽距离
            childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
 
            //或者利用子物体和父物体的距离判断是否超过最大距离,当距离大于等于最大的距离时候,
            //计算父物体和子物体的向量,然后利用向量*最大距离来限制拖拽距离
            //if (Vector2.Distance(childRectTrans.position, this.transform.position) > maxDis)
            //{
            //    Vector2 dir = (childRectTrans.position - this.transform.position).normalized;
            //    childRectTrans.anchoredPosition = dir * maxDis;
            //}
            GetHV();
        }
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
        //当结束拖动,要将物体归0,为了加一点缓冲效果
        //(1)可以使用dotween等补间动画插件,会减少很多
        //rectTransform.DoAnchoredPos(Vector2.zero,0.5f);
        //(2)或者使用携程 这里使用携程
        if (coroutine == null)
            coroutine = StartCoroutine(IEToZeroPos(childRectTrans, 0.1f));
    }
    private void GetHV()
    {
        h = childRectTrans.anchoredPosition.x / maxDis;
        v = childRectTrans.anchoredPosition.y / maxDis;
    }
    private IEnumerator IEToZeroPos(RectTransform rectTransform, float duartion)
    {
        if (duartion == 0f)
        {
            yield return null;
            rectTransform.anchoredPosition = Vector2.zero;
            GetHV();
            coroutine = null;
            yield break;
        }
        Vector2 currentpos = rectTransform.anchoredPosition;
        float offx = currentpos.x / duartion;
        float offy = currentpos.y / duartion;
        while (rectTransform.anchoredPosition != Vector2.zero)
        {
            yield return null;
            rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x - offx * Time.deltaTime, rectTransform.anchoredPosition.y - offy * Time.deltaTime);
            GetHV();
            if (rectTransform.anchoredPosition.sqrMagnitude < 8f)
            {
                rectTransform.anchoredPosition = Vector2.zero;
                GetHV();
                coroutine = null;
                break;
            }
        }
    }
}

另外附上Cube上面的脚本  


private void Update()
    {
        Vector3 dir = new Vector3(JoyStick.h, 0, JoyStick.v);
        if (dir.sqrMagnitude > 0)
        {
            transform.Translate(dir * 3f * Time.deltaTime,Space.World);
            Quaternion targatRotate = Quaternion.LookRotation(dir, Vector3.up);
            transform.rotation = Quaternion.Slerp(transform.rotation, targatRotate, 3 * Time.deltaTime);
        }
    }

加个使用doTween的吧


using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections; using DG.Tweening;
public class JoyStick : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler
{
    public static float h, v;  //传出hv
    public float maxDis;    //最大距离
 
    private RectTransform childRectTrans;
    private Coroutine coroutine = null;
 
    void Start()
    {
        childRectTrans = transform.GetChild(0) as RectTransform;
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        if (coroutine != null)
        {
            StopCoroutine(coroutine);
            coroutine = null;
        }
    }
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 outPos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
        {
            childRectTrans.position = outPos;
 
            //限制拖拽距离
            childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
 
            //或者利用子物体和父物体的距离判断是否超过最大距离,当距离大于等于最大的距离时候,
            //计算父物体和子物体的向量,然后利用向量*最大距离来限制拖拽距离
            //if (Vector2.Distance(childRectTrans.position, this.transform.position) > maxDis)
            //{
            //    Vector2 dir = (childRectTrans.position - this.transform.position).normalized;
            //    childRectTrans.anchoredPosition = dir * maxDis;
            //}
            GetHV();
        }
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
        //当结束拖动,要将物体归0,为了加一点缓冲效果
        //(1)可以使用dotween等补间动画插件,会减少很多
        rectTransform.DoAnchoredPos(Vector2.zero,0.5f).OnUpdate(GetHV);     
    }
    private void GetHV()
    {
        h = childRectTrans.anchoredPosition.x / maxDis;
        v = childRectTrans.anchoredPosition.y / maxDis;
    }
  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯