国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity 之 使用原生UGUI實(shí)現(xiàn)隨手移動(dòng)搖桿功能經(jīng)典實(shí)例

這篇具有很好參考價(jià)值的文章主要介紹了Unity 之 使用原生UGUI實(shí)現(xiàn)隨手移動(dòng)搖桿功能經(jīng)典實(shí)例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

實(shí)現(xiàn)效果

本文最終實(shí)現(xiàn)效果:
unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#


一,實(shí)現(xiàn)思路

1.1 原理解析

做一個(gè)實(shí)驗(yàn)看一下使用ScrollRect組件實(shí)現(xiàn)搖桿的原理。

  1. Hierarchy面板右鍵 UI -> Scroll View 創(chuàng)建一個(gè)滾動(dòng)視圖,這個(gè)組件經(jīng)常被應(yīng)用于排行榜,選角色之類的可滑動(dòng)的界面。
    unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

  2. Scroll View -> Viewport -> Content 添加一個(gè)Image組件
    unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

  3. 運(yùn)行場景,鼠標(biāo)點(diǎn)擊并拖動(dòng)中間部分,即可看到如下效果:
    unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

看到這里基本了解實(shí)現(xiàn)思路了吧,其實(shí)就是通過Scroll Rect組件的Context和Viewport的關(guān)系來進(jìn)行模擬的。
unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

更多關(guān)于ScrollRect的使用方法和實(shí)戰(zhàn)應(yīng)用,可以查看:Unity 之 UGUI Scroll Rect滾動(dòng)矩形組件詳解


1.2 思路概述

  1. 隨手指落下位置
    思路:其實(shí)就是根據(jù)手指第一次落下的屏幕坐標(biāo),修改搖桿的初始位置;手抬起時(shí)再將搖桿位置還原
    知識(shí)點(diǎn):獲取手指按下和抬起的回調(diào),將手指落下坐標(biāo)轉(zhuǎn)換為屏幕UI坐標(biāo)

  2. 搖桿移動(dòng)
    思路:使用Scroll Rect的移動(dòng)回調(diào),來控制中間的虛擬搖桿進(jìn)行位置變化
    注意的點(diǎn):使用OnDrag進(jìn)行回調(diào),并來控制虛擬搖桿的標(biāo)移動(dòng)位置不要超出背景

  3. 移動(dòng)回調(diào)
    思路:當(dāng)使用搖桿時(shí)使用Update進(jìn)行實(shí)時(shí)回調(diào)
    注意的點(diǎn):使用OnEndDrag進(jìn)行回調(diào),還原要個(gè)位置


二,實(shí)現(xiàn)代碼

2.1 隨手落下

通過錨點(diǎn)和RectTransformUtility坐標(biāo)轉(zhuǎn)換方法進(jìn)行位置設(shè)置。

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(EventTrigger))]
public class JoystickTouch : ScrollRect
{    
    protected override void Start()
    {            
        EventTrigger trigger = GetComponent<EventTrigger>();
        EventTrigger.Entry entryPointerUp = new EventTrigger.Entry();
        entryPointerUp.eventID = EventTriggerType.PointerUp;
        entryPointerUp.callback.AddListener((data) => { OnPointerUp((PointerEventData)data); });
        trigger.triggers.Add(entryPointerUp);

        EventTrigger.Entry entryPointerDown = new EventTrigger.Entry();
        entryPointerDown.eventID = EventTriggerType.PointerDown;
        entryPointerDown.callback.AddListener((data) => { OnPointerDown((PointerEventData)data); });
        trigger.triggers.Add(entryPointerDown);
    }
    
    // 隨手落下設(shè)置搖桿位置
    private void OnPointerDown(PointerEventData eventData)
    {
        Vector2 LocalPosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(this.GetComponent<RectTransform>(),
            eventData.position, eventData.pressEventCamera, out LocalPosition);
        this.viewport.localPosition = LocalPosition;
    }

    // 抬起還原位置
    private void OnPointerUp(PointerEventData eventData)
    {
        this.viewport.anchoredPosition3D = Vector3.zero;
    }

}

2.2 搖桿轉(zhuǎn)動(dòng)

還是在上面的類中重寫OnDrag方法,進(jìn)行虛擬搖桿中間位置的控制。

public class JoystickTouch : ScrollRect
{    
    // 半徑 -- 控制拖拽區(qū)域
    private float mRadius;
    
    protected override void Start()
    {
        mRadius = this.content.sizeDelta.x * 0.5f;
    }
    
    public override void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);
        joyIsCanUse = true;
        //虛擬搖桿移動(dòng)
        Vector3 contentPosition = this.content.anchoredPosition;
        if (contentPosition.magnitude > mRadius)
        {
            contentPosition = contentPosition.normalized * mRadius;
            SetContentAnchoredPosition(contentPosition);
        }

        // 搖桿內(nèi)部按鈕旋轉(zhuǎn)
        //if (content.anchoredPosition.y != 0)
        //{
        //    content.eulerAngles = new Vector3(0, 0,
        //        Vector3.Angle(Vector3.right, content.anchoredPosition) * content.anchoredPosition.y /
        //        Mathf.Abs(content.anchoredPosition.y) - 90);
        //}
    }
}

三,源碼分享

3.1 場景搭建

創(chuàng)建三個(gè)Image一個(gè)作為一個(gè)的子物體,依次為:接收點(diǎn)擊背景面積,搖桿背景板,搖桿中的虛擬按鈕。
第一個(gè)Image掛載新建腳本JoystickTouch
場景搭建如下:
unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#


3.2 完整代碼

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(EventTrigger))]
public class JoystickTouch : ScrollRect
{
    /// <summary>
    /// 拖動(dòng)差值
    /// </summary>
    public Vector2 offsetValue;
    
    // 半徑 -- 控制拖拽區(qū)域
    private float mRadius;
    
    /// <summary>
    /// 移動(dòng)中回調(diào)
    /// </summary>
    public System.Action<RectTransform> JoystickMoveHandle;
    /// <summary>
    /// 移動(dòng)結(jié)束回調(diào)
    /// </summary>
    public System.Action<RectTransform> JoystickEndHandle;

    /// <summary>
    /// 搖桿是否處于可用狀態(tài)
    /// </summary>
    public bool joyIsCanUse = false;
    
    protected override void Start()
    {
        mRadius = this.content.sizeDelta.x * 0.5f;
            
        EventTrigger trigger = GetComponent<EventTrigger>();
        EventTrigger.Entry entryPointerUp = new EventTrigger.Entry();
        entryPointerUp.eventID = EventTriggerType.PointerUp;
        entryPointerUp.callback.AddListener((data) => { OnPointerUp((PointerEventData)data); });
        trigger.triggers.Add(entryPointerUp);

        EventTrigger.Entry entryPointerDown = new EventTrigger.Entry();
        entryPointerDown.eventID = EventTriggerType.PointerDown;
        entryPointerDown.callback.AddListener((data) => { OnPointerDown((PointerEventData)data); });
        trigger.triggers.Add(entryPointerDown);
    }
    
    protected override void OnEnable()
    {
        joyIsCanUse = false;
        offsetValue = Vector2.zero;
    }
    
    public override void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);
        joyIsCanUse = true;
        //虛擬搖桿移動(dòng)
        Vector3 contentPosition = this.content.anchoredPosition;
        if (contentPosition.magnitude > mRadius)
        {
            contentPosition = contentPosition.normalized * mRadius;
            SetContentAnchoredPosition(contentPosition);
        }

        // 搖桿內(nèi)部按鈕旋轉(zhuǎn)
        //if (content.anchoredPosition.y != 0)
        //{
        //    content.eulerAngles = new Vector3(0, 0,
        //        Vector3.Angle(Vector3.right, content.anchoredPosition) * content.anchoredPosition.y /
        //        Mathf.Abs(content.anchoredPosition.y) - 90);
        //}
    }

    private void FixedUpdate()
    {
        if (joyIsCanUse)
        {
            JoystickMoveHandle?.Invoke(this.content);
            offsetValue = this.content.anchoredPosition3D;
        }
    }

    public override void OnEndDrag(PointerEventData eventData)
    {
        base.OnEndDrag(eventData);
        joyIsCanUse = false;
        offsetValue = Vector2.zero;
        JoystickEndHandle?.Invoke(this.content);
    }
    
    // 隨手落下設(shè)置搖桿位置
    private void OnPointerDown(PointerEventData eventData)
    {
        Vector2 LocalPosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(this.GetComponent<RectTransform>(),
            eventData.position, eventData.pressEventCamera, out LocalPosition);
        this.viewport.localPosition = LocalPosition;
    }

    // 抬起還原位置
    private void OnPointerUp(PointerEventData eventData)
    {
        this.viewport.anchoredPosition3D = Vector3.zero;
    }

}

3.3 實(shí)現(xiàn)效果

按鈕素材圖片:

unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#

unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#
實(shí)現(xiàn)效果:
unity ugui 遙感,ジ﹋★☆『 經(jīng)典示例 』,unity,ui,c#


工程下載:源碼和步驟都在上面分享過了,若還有什么不明白的,可以 點(diǎn)擊鏈接下載 ,積分不夠的童鞋關(guān)注下方卡片,回復(fù):“搖桿” 即可獲得開篇Demo源碼~文章來源地址http://www.zghlxwxcb.cn/news/detail-796342.html

到了這里,關(guān)于Unity 之 使用原生UGUI實(shí)現(xiàn)隨手移動(dòng)搖桿功能經(jīng)典實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【學(xué)習(xí)筆記】Unity基礎(chǔ)(七)【uGUI基礎(chǔ)、利用render Texture實(shí)現(xiàn)小地圖功能】

    【學(xué)習(xí)筆記】Unity基礎(chǔ)(七)【uGUI基礎(chǔ)、利用render Texture實(shí)現(xiàn)小地圖功能】

    轉(zhuǎn)載請(qǐng)注明出處:??https://blog.csdn.net/weixin_44013533/article/details/130808689 本篇基本是大綱性質(zhì),參考價(jià)值不大,只有最后一小節(jié)“利用render Texture實(shí)現(xiàn)小地圖功能”花了點(diǎn)時(shí)間,可以看看,不過也用到了上面的canvas、UI image等知識(shí)、以及input等腳本功能,也算一個(gè)小練手吧 倒是

    2024年02月08日
    瀏覽(25)
  • Unity中Shader測(cè)試常用的UGUI可交互功能的腳本基本使用

    Unity中Shader測(cè)試常用的UGUI可交互功能的腳本基本使用

    我們?cè)谏掀恼潞唵谓榻B了一下Shader測(cè)試時(shí)常用的UGUI功能。 Unity中Shader測(cè)試常用的UGUI功能簡介 我們?cè)谶@篇文章中,簡單看一下 可交互的UGUI的腳本怎么使用。 public Button _Button; void OnButtonClick() { Debug.Log(“你點(diǎn)擊了按鈕”); } _Button.onClick.AddListener(OnButtonClick); public Button _Button

    2024年02月04日
    瀏覽(31)
  • 【Unity InputSystem】實(shí)用教程-實(shí)現(xiàn)角色移動(dòng)跳躍功能(Input System在PC端鼠鍵!手機(jī)端觸摸屏!主機(jī)手柄!三端使用教程)

    【Unity InputSystem】實(shí)用教程-實(shí)現(xiàn)角色移動(dòng)跳躍功能(Input System在PC端鼠鍵!手機(jī)端觸摸屏!主機(jī)手柄!三端使用教程)

    在上一篇文章當(dāng)中我們手把手的跟大家分享了InputSystem的基礎(chǔ)操作(如何使用5種不同的方式獲取到InputSystem種的輸入檢查信息)。那么接下來我們繼續(xù)分享一下在我們獲取到InputSystem輸入信息后,如何使用檢測(cè)到的信息實(shí)現(xiàn)我們對(duì)應(yīng)的輸入功能。 本次我們使用的Unity編輯器版本為

    2024年02月11日
    瀏覽(24)
  • 使用U3D、pico開發(fā)VR(二)——添加手柄搖桿控制移動(dòng)

    使用U3D、pico開發(fā)VR(二)——添加手柄搖桿控制移動(dòng)

    1System: 2Move Speed:注意速度過小會(huì)導(dǎo)致看起來沒有移動(dòng) 3RightHandMoveAction(right loco move):個(gè)人采用右手柄實(shí)現(xiàn)移動(dòng) 1System: 2Turn?Speed:注意旋轉(zhuǎn)速度過小會(huì)導(dǎo)致看起來沒有移動(dòng) 3RightHandMoveAction:個(gè)人采用右手柄實(shí)現(xiàn)旋轉(zhuǎn) 至此,初步的移動(dòng)功能就實(shí)現(xiàn)了

    2024年02月08日
    瀏覽(30)
  • 【Unity2022】Unity實(shí)現(xiàn)手機(jī)游戲操控?fù)u桿(實(shí)現(xiàn)操控輪盤)

    【Unity2022】Unity實(shí)現(xiàn)手機(jī)游戲操控?fù)u桿(實(shí)現(xiàn)操控輪盤)

    首先展示一下本文章實(shí)現(xiàn)的效果: 創(chuàng)建兩個(gè)UI圖像,一個(gè)用于表示背景,作為父物體,命名為JoyStick,一個(gè)表示搖桿,命名為Center。 背景圖像選擇一個(gè)圓,最好加點(diǎn)半透明的屬性,最終完成圖如下圖所示。 創(chuàng)建一個(gè)腳本,命名為Joystick,然后將腳本掛載到JoyStick物體上,我們

    2024年02月07日
    瀏覽(21)
  • 【Unity】Joystick Pack搖桿插件實(shí)現(xiàn)鎖四向操作

    【Unity】Joystick Pack搖桿插件實(shí)現(xiàn)鎖四向操作

    ? 簡介:一款Unity搖桿插件,非常輕量化 ? 搖桿移動(dòng)類型:圓形、橫向、豎向 ? 搖桿類型: Joystick 描述 Fixed 固定位置 Floating 浮動(dòng)操縱桿從用戶觸碰的地方開始,一直固定到觸碰被釋放。 Dynamic 動(dòng)態(tài)操縱桿從用戶觸摸的地方開始,然后隨著觸摸在屏幕上移動(dòng)。 Variable 可變

    2024年01月16日
    瀏覽(20)
  • Unity中Shader測(cè)試常用的UGUI功能簡介

    Unity中Shader測(cè)試常用的UGUI功能簡介

    我們?cè)跍y(cè)試Shader效果時(shí),可能會(huì)使用到一些簡單的UGUI功能。在這篇文章我們大概的介紹一下UGUI的基礎(chǔ)功能。 Unity的UGUI幫助文檔 錨點(diǎn)是針對(duì)父級(jí)進(jìn)行變換的。 錨點(diǎn)的作用是讓UI適配不同設(shè)備的屏幕變換 需要修改為中心點(diǎn)模式 可以實(shí)現(xiàn)子對(duì)象 跟隨 父對(duì)象 縮放的功能 我們?cè)趧?chuàng)

    2024年02月04日
    瀏覽(26)
  • Unity UGUI的Outline(描邊實(shí)現(xiàn)事務(wù)的原子性)組件的介紹及使用

    Outline(描邊)組件是Unity UGUI中的一種特效組件,用于給UI元素添加描邊效果。通過設(shè)置描邊的顏色、寬度和模糊程度,可以使UI元素在視覺上更加突出。 Outline(描邊)組件通過在UI元素周圍繪制多個(gè)相同的UI元素,并設(shè)置不同的顏色和大小,從而實(shí)現(xiàn)描邊的效果。描邊的寬度和模糊

    2024年02月22日
    瀏覽(30)
  • unity通過腳本實(shí)現(xiàn)漫游功能 wasd控制玩家移動(dòng),空格跳躍,鼠標(biāo)控制視野旋轉(zhuǎn),滑輪控制鏡頭伸縮

    將場景中的攝像機(jī)刪除,在玩家的控制面板中添加Camera組件,和rigibody組件 ? using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour { ? ? public float speed; ? ? Rigidbody rigid; ? ? void Start() ? ? { ? ? ? ? ? ? ? ? rigid = GetComponentRigidbody(); ? ? } ?

    2024年02月10日
    瀏覽(27)
  • PICO 推搖桿移動(dòng)

    SDK版本 Pico UnityXR SDK v2.0.5?? 推搖桿,根據(jù)搖桿的偏移量,每幀進(jìn)行移動(dòng)和旋轉(zhuǎn) 右手的搖桿,如果要想左手,第17行代碼改成XRNode.LeftHand

    2024年02月14日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包