2017-03-04 2 views
0

マウスでクリックされたオブジェクトを別の変数に保存しようとしていますが、その型をチェックするif文でもRaycastHitはGameObjectに変換されません。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)hit;のようにキャストする必要があります – 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

あなたが探しているオブジェクトは、物理空間のボリュームを表すヒットGameObjectのコンポーネントであるhit.colliderです。 hit.collider.gameObjectでゲームオブジェクト全体を取得できます。