적이나 기타 오브젝트와 상호작용하면 플레이어와 상호작용 객체가 동시에 어떤 로직을 실행시켜야 할 때, 플레이어와 적 내부에 직접적인 로직을 넣지 않고 방문자 객체를 구현해 방문자 내에서 해당하는 타입에 따라 다른 객체 모델(적, 상호작용 오브젝트) 을 수정하는 로직을 방문자 내에서 구현한다.
public interface IVisitor
{
void Visit(T visitable) where T : IVisitable;
void Leave(T visitable) where T : IVisitable;
}
public interface IVisitable
{
void Accept(IVisitor visitor);
void Cancel(IVisitor visitor);
}
구현한 Ability 클래스로 방문을 받을 객체(몬스터, 오브젝트)와 상호작용이 가능하다
public override void Visit<T>(T visitable)
{
if (owner == null || visitable == null)
return;
if (visitable is Enemy enemy)
{
var temp = owner.transform.position;
owner.SetPosition(enemy.transform.position);
enemy.SetPosition(temp);
}
}
나 감동했잖아,,늘었어,,,이 사람 성장하는구나!!! 나 내일도 기대해도 되는거지??순찌 화이팅!!