お世話になっております。
現在、インターフェースを用いてプレイヤーがアイテムを拾えるかどうかの機能を作成しています。
機能自体は問題なく作ることができたのですが、ここで疑問となったのが、インターフェースを実装すべき側はどちらなのかということです。
例えば、下記の条件があったとします
・【プレイヤー】は、【フルーツ】を拾える。
この時に
- プレイヤー側にフルーツを拾うことができる
IItemGettable
のようなインターフェースを実装するべきなのか - フルーツ側に、拾われることができる
IGettable
というインターフェースを実装するべきなのか
#サンプル #1 プレイヤー側に実装する場合
IItemGettable
cs
1using UnityEngine; 2 3public interface IItemGettable { 4 void PickUp(GameObject obj); 5}
Player.cs
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 public class Player : MonoBehaviour, IItemGettable { 6 public void PickUp(GameObject obj) { 7 Debug.Log(obj.name + "を手に入れた"); 8 } 9 } 10
Fruits
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Fruits : MonoBehaviour { 6 7 private void OnCollisionEnter(Collision collision) { 8 var target = collision.gameObject.GetComponent<IGettable>(); 9 10 if (target != null) { target.Pickup(gameObject); } 11 } 12 13} 14
#サンプル #2 フルーツ側に実装する場合
IGettable
cs
1public interface IGettable { 2 void Get (); 3}
Player.cs
cs
1void OnTriggerEnter (Collider collision) { 2 var iGettable = collision.GetComponent<IGettable>(); 3 4 if (iGettable != null) { 5 iGettable.Get(); 6 Debug.Log("アイテムを取得しました"); 7 } 8 9}
Fruits.cs
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 6public class Gem : MonoBehaviour, IGettable { 7 public void Get () { 8 GetComponent<Renderer>().enabled = false; 9 Debug.Log("自身を消す(取得された)"); 10 } 11} 12
サンプル間で多少のコードの差はあるとしても、どちら側が主体となるべきなのか、どちら側が処理を判断すべきなのか。
インターフェースを実装する際の考え方など、ご教授いただければ幸いです。
回答2件
あなたの回答
tips
プレビュー