2017-03-04 82 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检索整个游戏对象。