iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Software Development

從零開始!使用chatGPT製作Unity回合制卡牌遊戲系列 第 29

從零開始!使用chatGPT製作Unity回合制卡牌遊戲 Day 29 - Raycast

  • 分享至 

  • xImage
  •  

昨天停留在一段程式碼的解讀:

using UnityEngine;

public class NodeDetection : MonoBehaviour
{
    public float raycastDistance = 1.0f;

    void Update()
    {
        // Cast a ray downward from the object's position
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, raycastDistance);

        if (hit.collider != null)
        {
            // Check if the collider belongs to a node
            if (hit.collider.CompareTag("Node"))
            {
                // Object is above a node, update its position here
                float newY = hit.collider.transform.position.y + 1.0f; // Set to node's Y position + offset
                transform.position = new Vector3(transform.position.x, newY, transform.position.z);
            }
        }
    }
}

但是我們馬上就遇到了看不懂的地方。
RayCastDistance是做什麼的?
Ray其實就是一種資料結構,代表著Origin起始點和Direction目的地。

舉例來說,可以使用一些韓式達成不同的用法:

Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);

if(physics.Raycast(cameraRay, out RaycastHit hitObject))
{
    objectLabel.text = hitObject.collider.gameObject.name;
}

這邊先定義一種Ray叫做cameraRay,是從Main Camera中往目標位置射出的Ray。目標位置是滑鼠位置。
然後判斷式中使用Physics函式中的Raycast。
官方文件內寫了多種關於該函式的用法,這裡是使用最後一種。
該Raycast()可以傳入五種參數:

  1. Ray
  2. hitInfo
  3. MaxDistance
  4. layerMask
  5. queryTriggerInteraction。

而這邊使用了兩個:Ray是前面宣告的cameraRay,還有那個out RaycastHit hitObject。
相關的參數解釋,可以看這個:
https://ithelp.ithome.com.tw/upload/images/20231013/20163235LNXaYjzJa7.png


而在ChatGPT提供的程式碼內:

RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, raycastDistance);

比較像是這種定義:
https://ithelp.ithome.com.tw/upload/images/20231013/20163235HjXM6tyD8M.png

是由物件往下方射出,與一般的從鏡頭射出的用法不太一樣。
而為什麼要這樣使用呢?
因為該物件將會是玩家方塊。
所以後續程式碼檢測,若Ray的碰撞不為Null空,則:
建立新的Vector3來設定物件位置。

這些是因為,玩家方塊將會檢測底下是否為Node,
並決定是否能夠前往。

然而該程式碼的邏輯有些奇特。
若是已經往下發射Ray並且不為空,則不就在Node上方了嗎?

其實本該是「玩家僅能在節點上」,但是誤會成「為加緊能在節點上方」。
也就是"on"和"above"的誤會了。

但是沒關係,我們還是學會了Ray, Raycast的機制,
並且往後能夠活用之,
這才是本次鐵人賽我所期待的長進。

明天是最後一天了,請期待最後的主題。


上一篇
從零開始!使用chatGPT製作Unity回合制卡牌遊戲 Day 28 - Tilemap與程式碼
下一篇
從零開始!使用chatGPT製作Unity回合制卡牌遊戲 Day 30 - Unity Transform
系列文
從零開始!使用chatGPT製作Unity回合制卡牌遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言