Kodumdaki bir şeyin örnek olayını, ne demek istediğimin bir örneği olarak kullanacağımı düşünüyorum.Arabirimde kalıtım/hiyerarşiler. Net - daha iyi bir yolu var mı?
Şu anda bileşen tabanlı oyun sistemim için bir davranış/eylem sistemi üzerinde çalışıyorum. GameObjects sadece ilgili ayrıntıları gösteren bir IBehaviorComponent ve bunlara bağlı bir IActionComponent sahip olabilir, aşağıdaki maruz:
public interface IBehaviorComponent : IBaseComponent
{
IBehavior Behavior { get; }
}
public interface IActionComponent : IBaseComponent
{
IAction Action { get; }
void ExecuteAction(IGameObject target = null);
}
Şimdi, bu şimdiye kadar bütün ince (en azından bana!). Ancak, IActionComponent uygulamalarına baktığımda sorun demlemeye başlıyor. Örneğin
, basit IActionComponent uygulaması:
public class SimpleActionComponent : IActionComponent
{
public IAction Action { get; protected set; }
public void ExecuteAction(IGameObject target = null)
{
Action.Execute(target);
}
public void Update(float deltaTime) { } //from IBaseComponent
}
Fakat, bu reklam eylemleri zamanlanmış bir program üzerinde yürütülecek için izin veren daha karmaşık IActionComponent uygulanmasını tanıtmak istiyorum diyelim:
public class TimedActionComponent : IActionComponent
{
public IAction Action { get; protected set; }
public float IdleTime { get; set; }
public float IdleTimeRemaining { get; protected set; }
public void ExecuteAction(IGameObject target = null)
{
IdleTimeRemaining = IdleTime;
}
public void Update(float deltaTime)
{
if (IdleTimeRemaining > 0f)
{
IdleTimeRemaining -= deltaTime;
}
else
{
Action.Execute(target);
}
}
}
Ve şimdi, IdleTime'ı dışarıdan etkilerle değiştirilebilecek şekilde göstermek istiyorum.
public interface ITimedActionComponent : IActionComponent
{
float IdleTime { get; set; }
float IdleTimeRemaining { get; set; }
}
Ancak burada mesele benim bileşen sistem IBaseComponent itibaren bir düzey yukarı her şeyi saklar olmasıdır: ilk başta Düşüncelerim yeni bir arayüz oluşturmak için idi. Yani, bir GameObject için eylem bileşeni, bir IAimedActionComponent veya bir IRandomizedActionComponent veya bir ICrashTheProgramActionComponent gibi bir IActionComponent olarak alınır. Umarım bunun nedenleri açıktır, çünkü GameObject'i bileşenlerden biri için temel bileşen türünün (IActionComponent, IRenderableComponent, IPhysicsComponent, vb.) Ötesinde ne istediğini tam olarak bilmek zorunda kalmadan sorgulayabileceğimiz bir şey istiyorum.
Bunu temizlemenin daha iyi bir yolu var mı, bu özellik, alınan IActionComponent öğesinin ilgisini çeken türe dönüştürmek zorunda kalmadan, alt sınıflarda tanımlanan bu özellikleri göstermeme izin verecek mi? Ya da bunu gerçekleştirmenin tek/en iyi yolu budur. Bir şey gibi: Şu anda
public void IWantYouToAttackSuperSlow(IGameObject target)
{
//Let's get the action component for the gameobject and test if it's an ITimedActionComponent...
ITimedActionComponent actionComponent = target.GetComponent<IActionComponent>() as ITimedActionComponent;
if (actionComponent != null) //We're okay!
{
actionComponent.IdleTime = int.MaxValue; //Mwhaha
}
}
O Only Wayvar düşünüyorum, ama ben cahil değilim, ya da ahşap saklandığı bir model var mı, olacak göreyim herkes bir önerebilir Bunu başarabilmek için daha iyi bir yol.
Teşekkürler!
Benim diğer düşünce böyle yönelecek IActionComponentExecutor olarak, içinde başka bir nesne kullanmaktı oh ~ biz kurumsal y şimdi oluyoruz (harici nesneler daha sonra IActionComponentTimedExecutor izini olacak - Action.Execute() çağırmasını karar, ama bu yuvarlak-a-butik moda silbaştan getiriyor düşünüyorum !) IdleTime'ı değiştirmek için. – Terminal8
İlgilenmiyorum - actionComponent.IdleTime durumu bir tür genel çantada saklanır mı? Eğer öyleyse, temel arayüzünüzde 'Uygula (BagData bag)' ve 'Store (BagData bag) 'yöntemlerini kullanabilirsiniz. Bununla birlikte, türetilmiş türleri bilmeye ihtiyaç duyan özellikleri sorgulamak için kullanabileceğiniz bazı meta veri türlerini de göz önünde bulundurmanız gerekebilir. 'TypeDescriptor' özellik ızgaraları vb gibi şeyler tarafından kullanılan hazır bir başlangıç noktasıdır. –
Hayır, şu anda değil. Ben de bu konseptle aşina değilim - belki de sağlayabileceğiniz bir referans var mı? – Terminal8