頻繁に使用している「コンポーネントを取得する」gameObject.GetComponentですが、アセットしたスクリプトもコンポーネントである以上、GetComponentで取得することが可能です。
さらに続けてメソッド名も記述することで、他のクラス内のpublicなメソッドを実行することが可能です。
成果物
「弾」が敵に当たった時「敵」のスクリプトのメソッドを実行する、というものを作ります。
同じスクリプトさえセットされていれば、プレハブがプレハブに当たった場合なども有効です。
同じスクリプトさえセットされていれば、プレハブがプレハブに当たった場合なども有効です。
他のクラスのメソッドを実行
別のクラスのpublicなメソッドを実行
オブジェクト.GetComponent().呼び出すメソッド名();
オブジェクト.GetComponent().呼び出すメソッド名();
例として、弾が敵に当たると処理を行う場合で考えます。
弾はトリガーをONにしたコライダーが設置されており、弾と敵それぞれにスクリプトが設置されています。
弾はトリガーをONにしたコライダーが設置されており、弾と敵それぞれにスクリプトが設置されています。
先に敵のほうのスクリプトを開き、
弾が当たった時の挙動を、public void メソッド名()として記述します。publicにすることで、他のクラスからも呼び出し可能なメソッドになります。
ここでは仮にDestroyを記述し、弾が当たったら消滅するものとします。
ここでは仮にDestroyを記述し、弾が当たったら消滅するものとします。
弾側のスクリプトではOnTriggerEnter2D(Collider2D コライダーの名前)で当たった時のメソッドを作り、コライダー.gameObject.GetComponent().呼び出すメソッド名();のように記述します。
ただしこれだとプレイヤーキャラが撃った瞬間プレイヤーキャラに当たって呼び出されてしまう(プレイヤーキャラはスクリプト「target」をアタッチしてないので、エラーになる)ので、
ただしこれだとプレイヤーキャラが撃った瞬間プレイヤーキャラに当たって呼び出されてしまう(プレイヤーキャラはスクリプト「target」をアタッチしてないので、エラーになる)ので、
実行前にif (コライダー.gameObject.GetComponent()){}を挟みます。これだけで、「このスクリプトを持っている場合は実行」という意味になります。
この時点での実行結果。弾が壁は無視して、敵だけ消滅させていることが確認できます。
その他当たった時の処理
たとえば敵ごとにlifeというintを作っておいて、
インスペクターやスクリプトでそれぞれ値を設定し、
ライフがなくなったら消滅、といったやりかたが手ごろかと思います。
その他色々盛り込んでいきます。
//Unity C#
//弾
public class 弾 : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D trigger)
{
//目標のスクリプトがアタッチされてるオブジェクトにだけ実行
if (trigger.gameObject.GetComponent())
{
//呼び出し
trigger.gameObject.GetComponent().メソッド名();
Destroy(this.gameObject);
}
}
}
//敵
public class 相手のクラス名 : MonoBehaviour
{
public void メソッド名()
{
life = life - 1;
this.GetComponent().color += new Color(0, -0.3f, -0.3f, 0);
this.transform.Translate(targeting.x * -0.2f, targeting.y * 0.1f, 0);
if (life == 0)
{
Destroy(this.gameObject);
}
this.GetComponent().color = Color.white;
}
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。
コメント