У меня есть два класса на основе Unity, один из которых представляет объект Player, а другой представляет powerup, который должен иметь возможность манипулировать игроком.
Моя идея состоит в том, чтобы инкапсулировать операции манипулирования игроком в методекоторый может быть передан объекту игрока, например, когда игрок сталкивается с powerup.
Эти манипуляции могут включать в себя простые изменения поля и свойств (очки здоровья), но также, возможно, сопрограммы (автоматический выстрел или щит свременной интервал).
В настоящее время мой класс проигрывателя хранит все связанные с powerup операции внутри себя и вызывает их на основе строки, которая передается от объекта powerup при столкновении:
PlayerController.cs
public class PlayerController : MonoBehaviour
{
private Dictionary<string, UnityAction> powerupMethods;
// ...
public void ActivatePowerUp(string name)
{
Invoke(powerUpMethods[name]);
}
}
Powerup.cs
public class Powerup : MonoBehaviour
{
private string _name;
// ...
private void OnCollision2D(Collision col)
{
PlayerController p = col.collider.GetComponent<PlayerController>();
if (p != null)
{
p.ActivatePowerup(_name);
}
}
}
Мое желание состояло бы в том, чтобы убрать всю логику, связанную с powerup, из объекта игрока и сохранить его в соответствующих powerups.
Есть литехническая возможность содержать такие операции в методе, который может бытьоценивается от объекта powerup до объекта player, что-то вроде этого?В лучшем случае объект player может получить доступ к закрытым полям внутри метода.
// Powerup.cs
public void Ability()
{
// Do stuff with Player object, even private fields
// e.g. player._health++;
// But also activate self-based Coroutines
// e.g. StartCoroutine(CoroutineMethod());
}
private IEnumerator CoroutineMethod()
{
// e.g. auto fire for 5 seconds
}
private void OnCollision2D(Collision2D col)
{
PlayerController p = col.collider.GetComponent<PlayerController>();
if (p != null) p.Invoke(Ability());
}