頻繁に使用している「コンポーネントを取得する」gameObject.GetComponentですが、アセットしたスクリプトもコンポーネントである以上、GetComponentで取得することが可能です。
さらに続けてメソッド名も記述することで、他のクラス内のpublicなメソッドを実行することが可能です。
成果物
![shot2](https://sunagitsune.com/wp-content/uploads/2021/08/shot2.gif)
「弾」が敵に当たった時「敵」のスクリプトのメソッドを実行する、というものを作ります。
同じスクリプトさえセットされていれば、プレハブがプレハブに当たった場合なども有効です。
同じスクリプトさえセットされていれば、プレハブがプレハブに当たった場合なども有効です。
他のクラスのメソッドを実行
別のクラスのpublicなメソッドを実行
オブジェクト.GetComponent<呼び出すスクリプト名>().呼び出すメソッド名();
オブジェクト.GetComponent<呼び出すスクリプト名>().呼び出すメソッド名();
![dest1](https://sunagitsune.com/wp-content/uploads/2021/08/dest1.gif)
例として、弾が敵に当たると処理を行う場合で考えます。
弾はトリガーをONにしたコライダーが設置されており、弾と敵それぞれにスクリプトが設置されています。
弾はトリガーをONにしたコライダーが設置されており、弾と敵それぞれにスクリプトが設置されています。
![dmg1](https://sunagitsune.com/wp-content/uploads/2021/08/dmg1.png)
先に敵のほうのスクリプトを開き、
![dmg2](https://sunagitsune.com/wp-content/uploads/2021/08/dmg2.png)
弾が当たった時の挙動を、public void メソッド名()として記述します。publicにすることで、他のクラスからも呼び出し可能なメソッドになります。
ここでは仮にDestroyを記述し、弾が当たったら消滅するものとします。
ここでは仮にDestroyを記述し、弾が当たったら消滅するものとします。
![dmg3](https://sunagitsune.com/wp-content/uploads/2021/08/dmg3.png)
弾側のスクリプトではOnTriggerEnter2D(Collider2D コライダーの名前)で当たった時のメソッドを作り、コライダー.gameObject.GetComponent<呼び出すスクリプト名>().呼び出すメソッド名();のように記述します。
ただしこれだとプレイヤーキャラが撃った瞬間プレイヤーキャラに当たって呼び出されてしまう(プレイヤーキャラはスクリプト「target」をアタッチしてないので、エラーになる)ので、
ただしこれだとプレイヤーキャラが撃った瞬間プレイヤーキャラに当たって呼び出されてしまう(プレイヤーキャラはスクリプト「target」をアタッチしてないので、エラーになる)ので、
![dmg4](https://sunagitsune.com/wp-content/uploads/2021/08/dmg4.png)
実行前にif (コライダー.gameObject.GetComponent<呼び出すスクリプト>()){}を挟みます。これだけで、「このスクリプトを持っている場合は実行」という意味になります。
![shot1](https://sunagitsune.com/wp-content/uploads/2021/08/shot1.gif)
この時点での実行結果。弾が壁は無視して、敵だけ消滅させていることが確認できます。
その他当たった時の処理
![dmg5](https://sunagitsune.com/wp-content/uploads/2021/08/dmg5.png)
たとえば敵ごとにlifeというintを作っておいて、
![dmg6](https://sunagitsune.com/wp-content/uploads/2021/08/dmg6.png)
インスペクターやスクリプトでそれぞれ値を設定し、
![dmg7](https://sunagitsune.com/wp-content/uploads/2021/08/dmg7.png)
ライフがなくなったら消滅、といったやりかたが手ごろかと思います。
![dmg8](https://sunagitsune.com/wp-content/uploads/2021/08/dmg8.png)
その他色々盛り込んでいきます。
//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;
}
![](https://sunagitsune.com/wp-content/uploads/2021/07/computer-1343393_1280-160x90.jpg)
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。
コメント