2017-03-04 80 views
0

所以我試圖將鼠標單擊的對象保存到一個單獨的變量,但RaycastHit不會轉換爲GameObject,即使在檢查其類型的if語句中也是如此。C#故障設置變量

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

public class Select : MonoBehaviour 
{ 
    public GameObject selectorPrefab; 

    private GameObject selectedObject; 
    private GameObject clone; 

    void Update() 
    { 
     if(Input.GetMouseButtonDown(0))//left click 
     { 
      if(clone) 
      { 
       Destroy(clone); 
      } 

      RaycastHit hit; 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

      if (Physics.Raycast(ray, out hit) && hit.collider.tag == "Ship") 
      { 
       Vector3 position = hit.transform.position; 
       float scaleMultiplier = (hit.transform.localScale.x + hit.transform.localScale.z)/2; 

       clone = Instantiate(selectorPrefab); 
       clone.transform.position = position; 
       clone.transform.localScale *= scaleMultiplier; 

       if(hit is GameObject)//Green underline here 
       { 
        selectedObject = hit;//Red underline under "hit" 
       } 
      } 
     } 
    } 
} 
+2

您可能想要添加相關的技術/ API /框架標籤。 – Plutonix

+0

selectedObject = hit.transform.gameObject –

+0

您在紅色下劃線處的錯誤消息可能是無法從一種類型分配到另一種類型。你需要對它進行轉換,比如'selectedObject =(GameObject)命中;' – ClickRick

回答

2

只是用is操作不會改變hit變量的編譯時類型。您可以將您的if身體內任一投,或使用as代替:

var hitGameObject = hit as GameObject 
if (hitGameObject != null) 
{ 
    selectedObject = hitGameObject; 
} 

在C#7,你可以在if語句,而不是引入新的變量:

if (hit is GameObject hitGameObject) 
{ 
    selectedObject = hitGameObject; 
} 

但是,如果你知道它會總是GameObject(除非錯誤),只投:

// No if statement, just an unconditional cast 
selectedObject = (GameObject) hit; 
1

raycast的結果RaycastHit不是GameObject;相反,它包含了一組關於檢測到的命中信息,你可以看到這裏列出:https://docs.unity3d.com/ScriptReference/RaycastHit.html

你要找的對象是hit.collider,這是表示其在物理空間容積的命中游戲對象的一個​​組成部分;你可以用hit.collider.gameObject檢索整個遊戲對象。