2017-01-03 75 views
0

我在我的2D項目中有一個類(「foo」說),並且當我在鼠標位置獲得對遊戲對象的引用時,我想確定是否該對象屬於foo類。我獲得與我如何確定在鼠標位置的對象類(Unity3d)

GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject; 

其中mousePos結構是我的鼠標的位置的對象,而且它似乎打算工作。爲了測試I類曾嘗試以下:

  1. 如果(objAtMouse是富){...}
  2. FOO fooAtMouse = objAtMouse爲Foo; 如果(fooAtMouse){...}
  3. IF((objAtMouse.GetComponent( 「富」)爲富)!= NULL){...}

選項1.建議here是唯一的一個不產生錯誤,但產生了警告

給定表達式是從來沒有提供的(「富」)型

選項2的,也是在上面的鏈接建議,產生錯誤

無法通過引用轉換,裝箱轉換,解包轉換,包裝轉換或null類型轉換

選項3建議here併產生錯誤類型「UnityEngineGameObject」轉換到「富」

的NullReferenceException:對象沒有設置爲一個對象的一個​​實例

這似乎是一個簡單的任務,但我在這個問題上有點麻煩。那麼,我怎樣才能確定我鼠標結束的對象的類/類型?

任何幫助,非常感謝!

回答

2

如果Foo是一個組件,它可能是因爲您將它附加到GameObject,那麼選項3非常接近。但你不需要投它as Foo

Foo fooComponent = objAtMouse.GetComponent<Foo>(); 

if (fooComponent == null) .. //no Foo component. 

請注意,您應該檢查是否objAtMousenull第一..

+0

感謝您的回覆:)我已經嘗試了您的建議,但是我得到了上面列出的NullReferenceException。我錯過了什麼嗎? – Rookatu

+0

哪一行發生'NullReferenceException'?你有沒有檢查'objAtMouse'是否爲'null'? – Lincoln

+0

嗨。是的,我首先檢查objAtMouse是否爲null,並且只在所產生的if塊中對fooComponent進行後續測試。錯誤發生在運行時;有沒有辦法獲得有關哪條線導致錯誤的更多細節?謝謝! – Rookatu

0

場景中的所有對象是遊戲物體本身並不會cild類。你想找到將組件

所以,你必須使用obj.GetComponents把它弄出來遊戲對象的其他類

0

你也可以爲它分配一個標籤,然後使用

objAtmouse.compareTag('your tag name'); 
1

首先,是第一線路不能正常工作:

GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject; 

這假定你有一個不斷的成功命中。

Raycast2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero); 
if(hit.transform != null) 
{ 
    GameObject objAtMouse = hit.transform.gameObject; 
    if(objAtMouse.GetComponent<Foo>() != null){ 
      // Object has component Foo on it 
    } 
} 

另一種解決辦法是讓富式講述自己:

public class Foo:MonoBehaviour{ 
    private static HashSet<Transform>fooCollection; 
    private void Awake() 
    { 
      if(fooCollection == null) 
      { 
       fooCollection = new HashSet<Transform>(); 
      } 
      fooCollection.Add(this.transform); 
    } 

    private void OnDestroy() 
    { 
      fooCollection.Remove(this.transform); 
    } 

    public static bool CompareFooObject(Transform tr) 
    { 
      if(tr == null) return false; 
      return fooCollection.Contains(tr); 
    } 
} 

,那麼你可以使用它作爲:

Raycast2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero); 
if(Foo.CompareFooObject(hit.transform)) 
{ 
    // Is Foo type 
} 

的HashSet的優點是,它是相當快的找到物品。您還可以擴展該模式的用法,以便可以與任何類型的泛型一起使用,但我想現在就足夠了。

+0

Thank you for this answer,+1。我接受@林肯的答案作爲檢查無效性(你也提到)原來是這樣的是關鍵,儘管還有其他的問題需要解決,他早點回答,乾杯! – Rookatu