A의 함수에서 B의 함수를 호출하고 B 함수에서 A의 함수가 호출되는 것으로 결합도가 높다. A가 B를 가지고 가지고 있으면 커플링이 일어나기 쉽다.
Delegate는 위임해 주는 것으로 Delegate는 여러 함수가 실행하는 권한을 위임시켜 주는 것을 말한다. 예를 들어 Delegate에 Explosion, Fulling, Flying이 있을 때 Delegate 함수가 실행되면 Explosion, Fulling, Flying 함수가 실행된다. 객체를 소유하는 것이 아닌 함수의 주소를 소유하는 것이다.
public class Test_Physics_Trigger : MonoBehaviour { public delegate void DoAction(string name); //delegate는 public 사용 public DoAction OnDoAction; private void OnTriggerEnter(Collider other) { if (other.gameObject.name.Equals("Player") == false) return; OnDoAction?.Invoke(other.gameObject.name); } } public class Test_Falling : MonoBehaviour { private new Rigidbody rigidbody; private void Awake() { rigidbody = GetComponent<Rigidbody>(); } private void Start() { GameObject obj = GameObject.Find("Cube"); Test_Physics_Trigger physics =obj.GetComponent<Test_Physics_Trigger>(); physics.OnDoAction += OnEnter; } private void OnEnter(string name) { rigidbody.useGravity = true; print($"Falling : {name}"); } }
Invoke는 콜 해주는 함수로 delegate 안에 있는 함수를 호출시켜준다.
OnDoAction.Invoke(other.gameObject.name);
new 한정자는 이미 정의되어 있는 기본 클래스를 다시 재정의 하는 것이다.
private new Rigidbody rigidbody;
Null 조건 연산자는 해당 조건이 Null이 아닐 때 실행하고 Null이면 실행하지 않는다.
OnDoAction?.Invoke(other.gameObject.name);