まず、target.attachedRigidbody.GetComponent<BoxManager>()
は完全に不要で冗長です。私は人々がtarget.attachedRigidbody.gameObject.transform.GetComponent<BoxManager>();
のようなコードでさらに悪化するのを見てきました。それらはすべて1つのGameObjectに接続されているため、同じことをしています。
あなたはそれをtarget.GetComponent<BoxManager>();
にすることができます。衝突時に別のスクリプトを取得するためにすべての時間をGetComponent
機能を使用するためとして、
、それは大丈夫です。それは、スクリプトの中で変数にアクセスする前に、衝突中にGameObjectに接続された別のスクリプトを取得する最も簡単な方法です。
OnTriggerStay2D
では、GetComponent
を実行する必要がありますが、迷惑をかけることがあります。チェックするスクリプトがたくさんあるときは、もっと迷惑になります。
トリッキーな方法はDictionary
を使用することです....
void OnTriggerStay2D(Collider2D target){}
そして、あなたは衝突後、ターゲットからあなたBoxManager
スクリプトにアクセスする必要があります。
これはあなたのコリジョン機能です。 Start
関数では、辞書を初期化し、Collider2D
をキーとして使用し、値としてBoxManager
を使用します。
ゲームプレイ中にCollider2D
とBoxManager
のGameObjectsをインスタンス化して破棄すると、この辞書が更新されます。
Dictionary<Collider2D, BoxManager> scriptID = new Dictionary<Collider2D, BoxManager>();
その後、あなたの衝突関数内、BoxManager
コンポーネントを取得するためのキーとしてTryGetValue
とtarget
変数を使用します。このような
何か。実際に
void OnTriggerStay2D(Collider2D target)
{
if (target.CompareTag("Box"))
{
BoxManager result;
scriptID.TryGetValue(target, out result);
if (!result.isHeld)
{
}
}
}
、あなたの場合%このオブジェクトは、それに接続BoxManager
スクリプトを持っていることを100確認、あなたが行うことができTryGetValue
機能なしで1行のコードで:
void OnTriggerStay2D(Collider2D target)
{
if (target.CompareTag("Box"))
{
BoxManager result = scriptID[target];
}
}
上記のtarget.CompareTag
を使用すると、BoxManager
スクリプトを使用せずにオブジェクトを検出する機会を減らすことができます。 target.gameObject.tag
をtarget.CompareTag
に変更したことに注目してください。 target.CompareTag
を使用することをお勧めします。ガードとしてtarget.CompareTag("Box")
を使用しているときにTryGetValue
やContainsKey
機能を使用する必要がないように
は今のコードはBoxManager result = scriptID[target];
で簡素化されました。何の残りの部分を行うには
Dictionary<Collider2D, BoxManager> scriptID = new Dictionary<Collider2D, BoxManager>();
public BoxManager boxManagerPrefab;
void Start()
{
//Register your BoxManager instances to the Dictionary
for (int i = 0; i < 5; i++)
{
BoxManager bc = Instantiate(boxManagerPrefab) as BoxManager;
//Use Isntance ID of the Script as id
Collider2D cld2D = boxManagerPrefab.GetComponent<Collider2D>();
scriptID.Add(cld2D, bc);
}
}
void OnTriggerStay2D(Collider2D target)
{
if (target.CompareTag("Box"))
{
BoxManager result = scriptID[target];
if (!result.isHeld)
{
target.attachedRigidbody.AddForce(transform.right * thrust);
}
}
}
:以下
は全体のスクリプトの例は、どのように見えるかですか?メンバーにアクセスするためのコンポーネントの取得は、通常の方法です。 – Everts