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

Unity射線以及相關(guān)點(diǎn)擊觸發(fā)事件的歸納

這篇具有很好參考價(jià)值的文章主要介紹了Unity射線以及相關(guān)點(diǎn)擊觸發(fā)事件的歸納。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

例如:最近在做一些Unity的小游戲需要,需要用到射線檢測(cè)和點(diǎn)擊事件等操作,雖然都是一些很基礎(chǔ)的東西但是也折騰了一會(huì),主要有些細(xì)節(jié)沒處理好就會(huì)導(dǎo)致不觸發(fā),寫篇博客學(xué)習(xí)記錄一下吧。


一、射線檢測(cè)

??1、3D射線檢測(cè)

??這個(gè)是最常用的,常用于3D游戲中通過射線檢測(cè)來獲取鼠標(biāo)點(diǎn)擊的位置來控制任務(wù)角色的移動(dòng)、以及在射擊游戲中通過射線檢測(cè)來進(jìn)行子彈擊中檢測(cè)等。這里我不細(xì)說射線檢測(cè)的API解析了,關(guān)于層級(jí)以及忽略自身碰撞體等情況直接查看對(duì)應(yīng)的API即可。代碼如下:

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log("射線檢測(cè):" + hit.collider.name);
            }
        }

注意:射線檢測(cè)是跟碰撞體配合使用的,當(dāng)我們使用3D射線檢測(cè)API的時(shí)候,需要給被檢測(cè)的對(duì)象加上3D碰撞體。

??2、2D射線檢測(cè)

這個(gè)多用于2D游戲之中,其實(shí)和本質(zhì)3D幾乎一直但是在發(fā)射射線的時(shí)候由于是2D,需要忽略Z軸的影響并且在發(fā)射的時(shí)候需要將屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo)。代碼如下:

        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, 1000);
            if (hit.collider != null)
            {
                Debug.Log("射線檢測(cè):" + hit.collider.name);
            }
        }

注意:2D檢測(cè)需要添加2D碰撞體,且需要進(jìn)行屏幕坐標(biāo)到世界坐標(biāo)的轉(zhuǎn)換。

二、鼠標(biāo)按下事件OnMouseDown

當(dāng)我們需要在點(diǎn)擊某個(gè)物體(非UGUI)的時(shí)候,我們希望對(duì)自己本身和相關(guān)聯(lián)的對(duì)象進(jìn)行一系列的操作,這個(gè)時(shí)候我們就會(huì)用到這個(gè)函數(shù),并且這個(gè)函數(shù)是自動(dòng)觸發(fā)的。但是必須要掛在在非UGUI的物體上。代碼如下:

    private void OnMouseDown()
    {
        //這個(gè)函數(shù)的觸發(fā)需要依賴碰撞體,并且這個(gè)腳本必須掛在在檢測(cè)的物體上且只能在點(diǎn)擊自己碰撞體的時(shí)候才會(huì)觸發(fā),類似于IPointClickHanlder這些接口事件觸發(fā)一樣
        Debug.Log("鼠標(biāo)按下");
    }

注意:這個(gè)函數(shù)是依賴于碰撞體的而且必須要掛載在非UGUI的物體上才會(huì)觸發(fā),還有對(duì)應(yīng)的鼠標(biāo)拖拽(OnMouseDrag())、鼠標(biāo)抬起(OnMouseUp()、鼠標(biāo)進(jìn)入(OnMouseEnter)等等類似的函數(shù),幾乎都是一樣的只是觸發(fā)條件不一樣。

三、UGUI常用檢測(cè)接口

對(duì)于UGUI的物體,我們也經(jīng)常需要對(duì)鼠標(biāo)在其上面的操作狀態(tài)來進(jìn)行對(duì)應(yīng)的操作和事件響應(yīng),這就要用到我們UGUI中的事件系統(tǒng)了。我們只需要繼承對(duì)應(yīng)的鼠標(biāo)操作接口,然后在接口實(shí)現(xiàn)函數(shù)中進(jìn)行對(duì)應(yīng)的操作即可。包含有:鼠標(biāo)進(jìn)入(IPointerEnterHandler)、鼠標(biāo)點(diǎn)擊(IPointerClickHandler)、鼠標(biāo)按下(IPointerDownHandler)等等。具體部分代碼如下:

public class UGUI檢測(cè) : MonoBehaviour, IPointerClickHandler,IPointerDownHandler,IPointerEnterHandler
{
    //這些接口的檢測(cè)都是基于射線檢測(cè)的,在UGUI中需要勾選UI組件的Raycaset Target,否則無法觸發(fā)
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("鼠標(biāo)點(diǎn)擊:" + transform.name);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("鼠標(biāo)按下");
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
         Debug.Log("鼠標(biāo)進(jìn)入");
    }

}

注意:實(shí)現(xiàn)接口的腳本必須掛載在需要監(jiān)聽的UGUI物體上,并且掛載的UGUI物體的Raycast Target是需要勾選的,否則無法被檢測(cè)到。這些事件的觸發(fā)是基于UGUI的事件系統(tǒng)的,所以在使用的時(shí)候務(wù)必確保Unity項(xiàng)目的Hierarchy面板必須有一個(gè)物體掛載了EventSystem.

四、UGUI射線檢測(cè)

有時(shí)我們也需要在UGUI中進(jìn)行射線的檢測(cè)來獲取我們當(dāng)前點(diǎn)擊到的UGUI物體,這種方法也是基于UGUI事件系統(tǒng)而來的。具體實(shí)現(xiàn)代碼如下:

    /// <summary>
    /// 通過射線檢測(cè)獲得點(diǎn)擊的UI物體
    /// </summary>
    /// <param name="position">輸入的點(diǎn)</param>
    /// <returns></returns>
    public GameObject GetFirstPickGameObject(Vector2 position)
    {
        //創(chuàng)建事件對(duì)象
        EventSystem eventSystem = EventSystem.current;
        PointerEventData pointerEventData = new PointerEventData(eventSystem);
        pointerEventData.position = position;

        //射線檢測(cè)結(jié)果列表
        List<RaycastResult> uiRaycastResultCache = new List<RaycastResult>();
        //對(duì)UI元素進(jìn)行射線檢測(cè)
        eventSystem.RaycastAll(pointerEventData, uiRaycastResultCache);
        //判斷結(jié)果列表的數(shù)量并且輸出第一個(gè)檢測(cè)到的物體
        if (uiRaycastResultCache.Count > 0)
        {
            return uiRaycastResultCache[0].gameObject;
        }
        return null;
    }
    private void Update()
    {
        //射線檢測(cè)UI
        if (Input.GetMouseButtonDown(0))
        {
            GameObject go = GetFirstPickGameObject(Input.mousePosition);
            if (go)
            {
                Debug.Log("檢測(cè)到點(diǎn)擊的物體:" + go.name);
            }
        }
    }

注意:由于這種檢測(cè)方法也是基于Unity中的UGUI事件系統(tǒng)的所以也需要勾選被檢測(cè)UGUI物體的Raycast Target允許接受射線,并且在Hierarchy面板中也需要進(jìn)行EventSystem組件的掛載,這個(gè)函數(shù)是可以檢測(cè)到當(dāng)前面板中的所有接收射線的UI的,無需掛在在特定的物體上。

五、拓展

在游戲過程中我們經(jīng)常需要判斷鼠標(biāo)是否點(diǎn)擊在UI上,假如點(diǎn)擊在UI上的話我們就不需要讓人物移動(dòng)到我們點(diǎn)擊的目標(biāo)點(diǎn)了,以及我們?cè)谝恍┣闆r下需要進(jìn)行UI穿透等操作,這些都需要我們檢測(cè)是否點(diǎn)擊在UI上。我們可以使用以下代碼判斷當(dāng)前是否點(diǎn)擊在UI上。如下:

        //檢測(cè)是否點(diǎn)擊到了UGUI物體
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                Debug.Log("當(dāng)前點(diǎn)擊在物體上了");
            }
        }

注意:這個(gè)也是基于UGUI事件系統(tǒng)的,需要開啟接收射線(Raycast Target),并且場(chǎng)景中有掛載EventSystem。無需掛在在特定物體上且只檢測(cè)UGUI對(duì)象。

六、總結(jié)

對(duì)于不同的情況我們可以選擇自己需要的以及最方便、高效的檢測(cè)方法,以上為個(gè)人學(xué)習(xí)記錄,如有不對(duì)的地方希望大家指正討論,一起學(xué)習(xí)進(jìn)步。文章來源地址http://www.zghlxwxcb.cn/news/detail-789866.html

到了這里,關(guān)于Unity射線以及相關(guān)點(diǎn)擊觸發(fā)事件的歸納的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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)文章

  • Unity之OpenXR+XR Interaction Toolkit實(shí)現(xiàn) 射線和物體交互事件回調(diào)

    Unity之OpenXR+XR Interaction Toolkit實(shí)現(xiàn) 射線和物體交互事件回調(diào)

    前面我們介紹了如何抓取物體,今天我們來說一下如何和3D的物體進(jìn)行交互,得到接觸的事件回調(diào)。 交互的兩種方式: 1.直接抓取或者射線抓取物體,得到接觸回調(diào) 2.射線或者手部觸摸物體后,得到接觸回調(diào) 我們需要準(zhǔn)備好Unity工程和環(huán)境配置 有了前文:Unity之OpenXR+XR Inter

    2024年02月13日
    瀏覽(126)
  • 【Unity功能】鼠標(biāo)移動(dòng)觸發(fā)事件方法

    【Unity功能】鼠標(biāo)移動(dòng)觸發(fā)事件方法

    ?方法一:方法觸發(fā) 注意:UGUI不能使用該方法 方法二:Event Trigger 注意:需要場(chǎng)景中包含EventSystem(在添加trigger組件后自動(dòng)添加);UGUI可以使用 方法三:

    2024年01月25日
    瀏覽(19)
  • Unity 2D點(diǎn)擊事件、碰撞

    1.事件封裝 定義腳本,實(shí)現(xiàn)事件相關(guān)接口即可 2.點(diǎn)擊對(duì)象必須要添加BoxCollider2D腳本 3.攝像機(jī)上必須添加Physics2DRaycaster腳本 4.GameInputEvent2D 事件必須添加在掛載Physics2DRaycaster的對(duì)象及其父類身上。 5.如果要有碰撞或者觸發(fā)器回調(diào),碰撞其中之一要添加Rigidbody2D腳本,且不能設(shè)置

    2024年02月09日
    瀏覽(24)
  • Unity實(shí)現(xiàn)文本點(diǎn)擊事件

    Unity實(shí)現(xiàn)文本點(diǎn)擊事件

    寫在前面的一些碎碎念: 好久沒有來寫文章了,主要是這一兩年找了一份不錯(cuò)的工作,進(jìn)入了舒適區(qū),工作上的功能沒有什么創(chuàng)新,都是以前做過的功能。這不,最近開發(fā)一款類似傳奇的手游,需要實(shí)現(xiàn)聊天欄文字點(diǎn)擊的效果,今天就來分享一下。 直接上代碼,組件用的是

    2024年02月13日
    瀏覽(25)
  • unity 點(diǎn)擊事件

    unity 點(diǎn)擊事件

    目錄 點(diǎn)擊按鈕,顯示圖片功能教程 第1步添加ui button,添加ui RawImage 第2步 添加腳本: 第3步,把腳本拖拽到button,點(diǎn)擊button,設(shè)置腳本的變量, GameObject添加 Component組件 第1步添加ui button,添加ui RawImage 第2步 添加腳本: 第3步,把腳本拖拽到button,點(diǎn)擊button,設(shè)置腳本的變量

    2024年02月19日
    瀏覽(20)
  • Unity UI點(diǎn)擊事件系統(tǒng)

    在Unity 的UGUI開發(fā)過程中,我們經(jīng)常需要對(duì)UI圖片進(jìn)行操作響應(yīng)各種處理比如:點(diǎn)擊,長(zhǎng)點(diǎn)擊,長(zhǎng)按,拖拽等多種功能的實(shí)現(xiàn),這時(shí)原本的Button組件就不夠用了 我們需要自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的點(diǎn)擊事件系統(tǒng)來響應(yīng)用戶的各種操作,下面可以分析一下思路。 首先你需要提前了解點(diǎn)

    2024年01月17日
    瀏覽(23)
  • unity鼠標(biāo)單擊物體與雙擊物體觸發(fā)不同的事件

    unity鼠標(biāo)單擊物體與雙擊物體觸發(fā)不同的事件

    下面舉例在unity里面Canvas下面添加一個(gè)image,當(dāng)鼠標(biāo)移動(dòng)到image點(diǎn)擊一次觸發(fā)事件 Debug.Log(“SingleClick!”);當(dāng)鼠標(biāo)在image點(diǎn)擊兩次觸發(fā)事件 Debug.Log(“DoubleClick!”);鼠標(biāo)雙擊和單機(jī)出現(xiàn)不同的響應(yīng)事件 在Canvas或者需要點(diǎn)擊的父物體上添加組件EventTrigger,打開 Add New Trigger 的菜單,添

    2024年02月11日
    瀏覽(98)
  • Unity UGUI實(shí)現(xiàn)點(diǎn)擊事件穿透

    ?代碼很簡(jiǎn)單如下 將此代碼掛載到上層節(jié)點(diǎn)上即可 使用此方案遇到的一些問題以及處理方法 1.下層Button沒響應(yīng)問題 如果只傳遞一層的情況 Button的Text文本 或者Button下面有遮擋物 并且Raycast Target是true的情況它會(huì)傳遞給Text或者 其他遮擋物 而Button 不會(huì)收到點(diǎn)擊消息 所以如果想

    2024年04月09日
    瀏覽(28)
  • [Unity]UI事件(鼠標(biāo)進(jìn)入、離開、點(diǎn)擊)

    1、首先繼承IPointerEnterHandler、IPointerExitHandler等接口 2、實(shí)現(xiàn)其方法 如:OnPointerEnter、OnPointerExit 注意:這些只對(duì)UI有效,而OnMouseEnter只對(duì)加Collider的非UI有效

    2024年03月17日
    瀏覽(33)
  • 【100個(gè) Unity實(shí)用技能】?? | Unity中 過濾透明區(qū)域的點(diǎn)擊事件

    【100個(gè) Unity實(shí)用技能】?? | Unity中 過濾透明區(qū)域的點(diǎn)擊事件

    ?? 博客主頁(yè):https://xiaoy.blog.csdn.net ?? 本文由 呆呆敲代碼的小Y 原創(chuàng),首發(fā)于 CSDN ?? ?? 學(xué)習(xí)專欄推薦:Unity系統(tǒng)學(xué)習(xí)專欄 ?? 游戲制作專欄推薦:游戲制作 ??Unity實(shí)戰(zhàn)100例專欄推薦:Unity 實(shí)戰(zhàn)100例 教程 ?? 歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯(cuò)誤敬請(qǐng)指正! ?? 未來很長(zhǎng)

    2024年01月22日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包