iT邦幫忙

2022 iThome 鐵人賽

DAY 3
1
自我挑戰組

Unity 基本功能實作與日常紀錄系列 第 3

Day3: GetComponent from Object

  • 分享至 

  • xImage
  •  

最近對於 GetComponent我想記錄一些使用上的操作,並讓我更熟悉在 Unity 環境中使用。
我們知道在C#宣告物件的時後常會使用 new 加上類別名稱。但在Unity宣告或取得物件的方式會不太相同。
Object本身可以自帶許多Component。我通常會將在環境的Object稱為物件,物件會在Hierarchy內部。
Component則取名為每個物件中的元素,點選物件的時候,就會看到 Inspector 顯示該物件所有的元素。
物件可以包含很多的元素,但是若需要呼叫這些元素就需要有特定物件宣告的方法,在 Unity 中宣告某類別的物件不如同一般C# 的 new 加上類別名稱。反而會有更有效率地以不同方式去實例化元素的內容。基本上我們在Unity 宣告物件有更簡單的方式。

所以接下來會透過不同的實作來使用本身物件的元素,並進行說明。

建立物件

  1. 首先在Hierarchy 左邊新增一個 Empty Component後,接著在右邊 Inspector 中去新增一個 Sprite Renderer 的 Component。(Sprite Renderer 中 Sprite 設定為 Knob)

  2. 接下來新增一個 Rigidbody 2D,將Gravity Scale 設定為 0。目的是我們不需要設定重力造成該Circle 向下墜落。

  3. 最後結果如下。

取得本身物件上的 Component

  1. 我們要去改寫該物件的顏色,這邊新增一個文本在下方的Project 資料夾下,最後拓移到我們 Circle 物件的 Inspector 區域。使其該文本成為我們物件的Component。

  2. 這邊撰寫文本上的內容。 每個文本會對應到該物件上 Inspector 上的物件,故注意到當我想要改變本身 Inspector 上物件的內容,比如說這邊要更改該 SpriteRenderer 物件上的顏色,我們必須要讓系統知道是Inspector 上哪一個物件。故需要透過以下的程式碼來取得該 Inspector 中取得特定的物件才能有效的更新物件的顏色。

SpriteRenderer spriter = GetComponent<SpriteRenderer>();

整體程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    private SpriteRenderer spriter;
    public Color newColor;
    void Start() 
    {
        spriter = GetComponent<SpriteRenderer>();
        spriter.color = newColor;

    }
    
}
  1. 接下來回到Unity 去設定你想要變更的顏色屬性。

  2. 執行該程式碼看有無變化。可以看到執行後由白轉綠。

取得另外一個文本物件上的操作

  1. 首先新增一個空白物件 Square,後續新增 Sprite Renderer 、 Rigidbody 2D、Box Collider 2D。(這邊Circle 物件也需要新增 RigidBody) 後續注意到 Sprite Renderer 內部的 Sprite 點選UISprite。 Rigidbody 2D 上的 Gravity Scale 設定為 0 (否則會因為重力而往下掉落)。

  2. 為了當物件碰撞的時候能被偵測,故我們將 Rigidbody 2D 上的 IsTrigger 點選起來(請注意務必要有Rigidbody 2D 在該 Circle 與 Square內部)

  3. 回到物件 Circle 上也要新增一個 Circle Collider 2D 的元素。(但請注意到當要偵測撞擊時,僅一個物件上的 Collider 元素設定 IsTrigger 即可。

  4. 接下來新增一個文本 Square.cs 放置到 Square 物件的 Inspector 上。

  5. 點開之前 ChangeColor.cs 的文本。 設定一個方法,最後將我們剛剛更改物件顏色的程式碼放入到我們公用的function, void setNewColor( )中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    private SpriteRenderer spriter;
    public Color newColor;
    void Start() 
    {
       
    }
    public void setNewColor()
    {
        spriter = GetComponent<SpriteRenderer>();
        spriter.color = newColor;
    }
    
}
  1. 之後開啟 Square.cs 文本。這邊我們要有個撞擊的觸發事件,每當撞擊觸發後會取得該 ChangeColor 文本所在的位置上之 Collider 元素。並且透過 ChangeColor 的物件去使用該 ChangeColor 類別下的方法 setNewColor。以下程式碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Square : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision) {
        ChangeColor changeColor = collision.GetComponent<ChangeColor>();
        changeColor.setNewColor();
    }
}
  1. 執行的過程中就可以發現到當Circle觸碰到 Square 的時候就會變更該 Circle 的顏色。

以物件的 Tag 取得該物件並操作

  1. 首先我們將Circle中的 Tag 設定成 Player。

  2. 打開 Square.cs 文本上去編寫一段程式。 我們也可以先宣告一個 GameObject,幫我們找尋到該tag 名為 Player 的物件後並存取。接著若 Player 並非為Null的話就使其將ChangeColor 文本在 Circle Inspector 中的 Sprite Renderer 的顏色作變更。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Square : MonoBehaviour
{

    private ChangeColor changeCol;
    private GameObject player;
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        if(player != null)
        {
            changeCol = player.GetComponent<ChangeColor>();
            changeCol.setNewColor();
        }

    }
}
  1. 執行後就會看到 Circle 的顏色變成綠色了。代表說另外一個 Scripts 可以去使用另外一個 Script 類別中的方法。簡單明瞭。

父子物件文本的操作

  1. 這裡要注意到更改Hierarchy物件的地方,我們將之前的 Square 放置到我們 Circle之 child 下。

  2. 我們要在 Square.cs 取得 Circle 中ChangeColor類別內的 Function,注意到我們這邊要取得該Parent 的物件。故需要使用 GetComponentInParent 來取得 Square 上 Circle Parent 文本中的方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Square : MonoBehaviour
{

    private ChangeColor changeCol;
 
    void Start()
    {
        changeCol = GetComponentInParent<ChangeColor>();
        changeCol.setNewColor();
    }

    
}
  1. 執行後就會看到顏色會改變。

基本宣告物件操作

  1. 若我們今天要使用其他文本的 function ,比如今天 Square 使用 Circle 文本中的 SetNewColor。必須先宣告一個 public 的 ChangeColor 的物件。接下來直接引用該方法在 Start 中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Square : MonoBehaviour
{
    public ChangeColor changeColorObj;

    void Start()
    {
        changeColorObj.setNewColor();
    }
}
  1. 一開始可能會懷疑為何不需要使用到任何GetComponent類別去獲取該 ChangeColor類別上的物件。是因為這樣宣告的話我們可以透過回到 Unity 中將具有該文本的物件中,拉入到我們 Square 上的 ChangeColor 的物件上。系統會自行地根據該物件的位置進行宣告其類別的物件。 Circle 就是你的物件,而ChangeColor 就是該Circle 物件內的元素 ChangeColor.c文本(腳本)。

  2. 這樣就可以使用 Circle 中的 SetNewColor 的方法。

結論 GetComponent<>

  1. 必須使用在 Start( ) 或 Awake( )
  2. 可以使用於 OnCollisionEnter , OnTriggerEnter 的方法中。
  3. 目的是去調用 events。
  4. 若你希望 Unity 自行尋找該類別上的物件,可以回到 Unity 將具有該腳本的物件拉入到你的腳本中,若你沒有看到你的腳本有該物件的名稱,代表你沒有設定成 public 變數型態。
  5. 以上就是我平時宣告物件或使用物件上元素的基本方法。

上一篇
Day2: Counter and Show Current DateTime
下一篇
Day4: Understand RaycastHit
系列文
Unity 基本功能實作與日常紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言