ETH官方钱包

前往
大廳
主題

Unity C# | 射線檢測(cè)與改變物體顏色之應(yīng)用

瓶裝雪 | 2023-07-10 19:00:10 | 巴幣 2 | 人氣 478

一、前言
  這篇文章將會(huì)從基本概述到射線偵測(cè)應(yīng)用的詳細(xì)步驟,講述運(yùn)用射線改變特定圖層中,射線命中的物件顏色。

二、射線檢測(cè)概述
  射線是初學(xué)者在學(xué)習(xí)控制非特定目標(biāo)的做法之一,另外一種是藉由碰撞體去偵測(cè)碰撞單位,射線是其中相對(duì)困難的做法,本篇文章會(huì)使用到射線與輔助線的內(nèi)容,有興趣可以參考之前的兩篇文章。




1.  創(chuàng)建射線
  我們會(huì)需要在遊戲物件創(chuàng)建一道射線,往遊戲場(chǎng)景中的某個(gè)方向發(fā)射,取得特定圖層的遊戲物件,這條射線會(huì)命中所有圖層的遊戲物件,只要對(duì)方有碰撞體組件,但只有在命中特定圖層才會(huì)通過判斷。

2.  改變命中物體顏色
  通過判斷後,我們要可視的改變,也可以使用 Debug.Log 去測(cè)試,我們會(huì)抓取命中物件的渲染組件,並改變渲染組件 Material 欄位的顏色。

三、射線應(yīng)用流程
  那接下來會(huì)簡單講述射線的流程。

1. 創(chuàng)建測(cè)試用方塊(Cube)
  創(chuàng)建三個(gè)測(cè)試方塊:
第一個(gè)方塊座標(biāo)位於(0,0,0),並命名為「origion」。
第二個(gè)方塊座標(biāo)位於(0,0,3),並命名為「Target_A」。
第三個(gè)方塊座標(biāo)位於(0,0,6),並命名為「Target_B」。

2. 創(chuàng)建程式腳本(Script)並添加至物件
  創(chuàng)建一個(gè)程式腳本,並添加到物件origion,可以拖曳程式腳本到此物件,也可以直接在此物件點(diǎn)擊 Add Component。

3. 宣告顯示變數(shù)
  這一次我們的射線起點(diǎn)為物件本身位置,並且往正前方打出一條射線,因此射線的起點(diǎn)與方向固定,我們將額外添加兩個(gè)參數(shù),分別為距離與圖層:
    [SerializeField] private float MaxDistance;
    [SerializeField] private LayerMask mask;

程式腳本自己可以抓取起點(diǎn)與方向,其宣告方式如下:
    private Vector3 m_position;
    private Vector3 direction;

程式腳本自己可以抓取渲染組件,其宣告方式如下:
    private Renderer render;

4. 函式-取得玩家位置
    private void GetDirection()
    {
        m_position = transform.position;
        direction = transform.forward;
    }
  我們要指定玩家的位置跟方向,封裝成一個(gè)函式的習(xí)慣,除了可以維護(hù)程式的可讀性,也能讓程式設(shè)計(jì)的過程清晰,此函式可以放在開始函式(Start()),如果其座標(biāo)會(huì)持續(xù)變動(dòng)的話,也可以放在更新函式(Update())。

5. 函式-雷射判斷
    private void RayCastHitTest()
    {
        Ray ray = new Ray(m_position, direction);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, MaxDistance, mask))
        {
            ChangeRenderColor(hit);
        }
    }
  函式自行宣告了兩個(gè)暫時(shí)變數(shù),第一個(gè)是雷射,其起點(diǎn)為物件的座標(biāo),方向?yàn)槲锛恼胺?;第二個(gè)是射線命中,可以抓取命中目標(biāo)的資料,包含遊戲目標(biāo)與命中點(diǎn)等訊息。

  創(chuàng)建一個(gè)判斷式,並在其中創(chuàng)建一個(gè)物理射線的判斷函式,我們選擇四個(gè)參數(shù)的判斷函式,包含雷射、射線命中訊息、最大距離、圖層,此函式會(huì)回傳一個(gè)布林值,若命中且圖層為指定圖層,則回傳 True。

6. 函式-改變物件顏色
    private void ChangeRenderColor(RaycastHit hit)
    {
        render = hit.transform.GetComponent<Renderer>();
        render.material.color = Color.red;
    }
  我們把改變命中目標(biāo)顏色的程式碼抓取出來變成一個(gè)函式,這個(gè)習(xí)慣一方面能協(xié)助此文章的章節(jié)分類,也能協(xié)助程式碼的維護(hù),若射線偵測(cè)同時(shí)用 Hit 進(jìn)行很多的操作,那這個(gè)習(xí)慣能準(zhǔn)確的分類命中功能。

  第一行程式碼,我們抓取命中目標(biāo)的渲染組件;第二行程式碼,我們改變渲染組件中材質(zhì)的顏色,並改成紅色。

7. 輔助線-在 Sence 中看見射線
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawRay(transform.position, transform.forward * MaxDistance);
    }
  我們使用官方內(nèi)建函式 OnDrawGizmos,它會(huì)創(chuàng)造一個(gè)此程式的Gizmos屬性,並由上往下執(zhí)行,首先我們改變此函式的顏色,改成藍(lán)色,並且繪製一條雷射,起點(diǎn)為自己,終點(diǎn)為方向乘上距離。

8. 測(cè)試
  最後,我們可以按下 Play 進(jìn)行測(cè)試,此時(shí)程式碼沒有效果,因?yàn)榇藭r(shí)的射線距離為默認(rèn)值。點(diǎn)擊 origion ,把 Max Distance 改為10,你會(huì)發(fā)現(xiàn)在 Sence 中出現(xiàn)一條藍(lán)色射線,往前打出,但是程式碼還是沒有效果。

  點(diǎn)擊Mask,我們改變它的圖層為 Default,這樣一來只要命中 Default 圖層時(shí),此物件的顏色就會(huì)變成紅色。

四、後記
  這篇文章是我研究射線順便寫的文章,主要是分享射線的實(shí)際使用,沒想到也花了我不少的時(shí)間。
送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

相關(guān)創(chuàng)作

更多創(chuàng)作