2017-07-28 6 views
0
  1. 私はGameObjectを作成し、それを「センサー」と命名しました。私はセンサーにBoxColliderとスクリプト(script_sensor)を追加しました。コンポーネントgameObjectからコンテナgameObjectにアクセス

  2. 私は別のGameObjectを作成し、それを「タクシー」と名づけました。私はタクシーにスクリプト(script_taxi)を追加し、スクリプトに公開Collider2Dを作成しました。

  3. 次に、センサーGameObjectをタクシーの公衆Collider2Dに割り当てました。

  4. 今、私はscript_taxiからscript_sensorにアクセスしたいと思います。

は基本的に、どのように私はscript_sensor(ボックス2)から、script_taxi(画像上のボックス1)にアクセスすることができますか?

Check the image to understand better.

シモンズ:私はタクシーのプレハブをスパムすると、すべてのセンサーオブジェクトは、それ自身のコンテナのゲームオブジェクト(タクシー)を見つけることができるはずです。

+0

(センサータクシーの子です)、 'transform.parent.gameObject.GetComponent ();' – ryeMoss

答えて

2

script_taxiからscript_sensorにアクセスする場合は、script_taxiの内部にscript_sensorという参照が必要です。 GetComponentを使用できます。また、GameObject.Findのバリエーションを使用することもできますが、これらの呼び出しは高価になる可能性があります。

public class script_sensor : MonoBehavior { 
    [SerializeField] 
    private GameObject taxi; 

    private script_taxi taxiScript; 

    void Start() { 
     taxiScript = taxi.GetComponent<script_taxi>(); 
    } 

} 

また、C# naming conventionsに従うことが推奨されます。このようにタクシーゲームオブジェクトを見つけるため

script_sensor => Sensor

script_taxi => Taxi

public Collider2D col; => [SerializeField] private Collider2D col;

+0

ここではいくつかのことが間違っています... C#命名規則は、Unityスクリプト、マテリアル、シェーダなどには厳密には適用されません。これらはコード内の変数ではなく、実際のスクリプトのファイル名です。このデータをシリアライズする予定がない限り、 'col'をシリアライズする必要はありません。これは、ここで達成しようとしているようには見えませんし、Unity Collider2Dをシリアライズすることもできません。 – ryeMoss

+0

私はあなたが私を誤解したと思います。添付した画像を確認してください。センサーオブジェクトが割り当てられている場所を見ることができます。 – MossTeMuerA

+0

@ryemoss私が提案した命名規則は、必ずしもファイル名ではなく、クラス名に適用されます。また、 'Collider2D'オブジェクトをそのスクリプトでのみ使用する予定がある場合、publicにする必要はありません。これがオブジェクト指向設計の基本原則の1つです。なぜあなたは 'Collider2D'をシリアル化できないのか分かりませんが、それは私のために完璧に動作しています。 –

0

それともGameObject.Find(と):タクシーはセンサーのコンテナである場合

script_taxi taxi; 

    void Awake() 
    {  
     taxi = GameObject.FindWith("taxi").GetComponent<script_taxi>(); 
    } 
+0

私はタクシーのプレハブを迷惑メールにすると、すべてのセンサーオブジェクトがそれ自身のコンテナーゲームオブジェクトを見つけることができるはずです。それがこの解決策が私を助けない理由です。 – MossTeMuerA

関連する問題