using System; using System.Collections; using System.Collections.Generic; using Lean.Pool; using UniRx; using UnityEngine; namespace Ichni.RhythmGame { public abstract class SubstantialObject : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule, IHaveColorSubmodule { #region [暴露属性字段] Theme Details public string themeBundleName, objectName; #endregion #region [子模块接口] Submodules public TransformSubmodule transformSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; } public ColorSubmodule colorSubmodule { get; set; } public virtual bool haveEmission => false; #endregion #region [生命周期] Lifecycle & Factory public static SubstantialObject GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, string themeBundleName, string objectName, GameElement parentElement) { GameObject themeBundleObject = ThemeBundleManager.instance.GetObject(themeBundleName, objectName); SubstantialObject substantialObject = Instantiate(themeBundleObject, parentElement.transform).GetComponent(); substantialObject.Initialize(elementName, id, tags, isFirstGenerated, parentElement); substantialObject.themeBundleName = themeBundleName; substantialObject.objectName = objectName; substantialObject.FirstSetUpObject(isFirstGenerated); return substantialObject; } /// /// 初次生成继承自SubstantialObject的对象时,生成方法必然使用SubstantialObject中的GenerateElement方法。 /// 因此对于需要进行特殊处理的子类,需要重写FirstSetUpObject方法。 /// 在读取Beatmap时,生成物体则使用子类本身的GenerateElement方法。 /// public virtual void FirstSetUpObject(bool isFirstGenerated) { } public override void SetDefaultSubmodules() { transformSubmodule = new TransformSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this); colorSubmodule = new ColorSubmodule(this); } #endregion } }