using Godot; /// <summary> /// 组件基类, 用于挂载到游戏物体上, 相比于原生 Node 更加轻量化, 可以大量添加组件 /// </summary> public abstract class Component : IProcess, IDestroy { /// <summary> /// 当前组件所挂载的游戏对象 /// </summary> public ActivityObject ActivityObject { get; private set; } /// <summary> /// 当前组件所挂载的物体的坐标 /// </summary> public Vector2 Position { get => ActivityObject.Position; set => ActivityObject.Position = value; } /// <summary> /// 当前组件所挂载物体的全局坐标 /// </summary> public Vector2 GlobalPosition { get => ActivityObject.GlobalPosition; set => ActivityObject.GlobalPosition = value; } /// <summary> /// 当前组件是否显示 /// </summary> public bool Visible { get => ActivityObject.Visible; set => ActivityObject.Visible = value; } /// <summary> /// 挂载物体的动画节点 /// </summary> public AnimatedSprite AnimatedSprite => ActivityObject.AnimatedSprite; /// <summary> /// 挂载物体的阴影节点 /// </summary> public Sprite ShadowSprite => ActivityObject.ShadowSprite; /// <summary> /// 挂载物体的碰撞器节点 /// </summary> public CollisionShape2D Collision => ActivityObject.Collision; /// <summary> /// 是否启用当前组件 /// </summary> public bool Enable { get; set; } = true; /// <summary> /// 是否被销毁 /// </summary> public bool IsDestroyed { get; private set; } //是否调用过 start 函数 internal bool IsStart = false; /// <summary> /// 第一次调用 Update 或 PhysicsUpdate 之前调用 /// </summary> public virtual void Start() { } /// <summary> /// 如果启用了组件, 则每帧会调用一次 Update /// </summary> /// <param name="delta"></param> public virtual void Update(float delta) { } /// <summary> /// 如果启用了组件, 则每物理帧会调用一次 PhysicsUpdate /// </summary> /// <param name="delta"></param> public virtual void PhysicsUpdate(float delta) { } /// <summary> /// 当组件被销毁时调用 /// </summary> public virtual void OnDestroy() { } /// <summary> /// 当该组件挂载到GameObject上时调用 /// </summary> public virtual void OnMount() { } /// <summary> /// 当该组件被取消挂载时调用 /// </summary> public virtual void OnUnMount() { } /// <summary> /// 当组件销毁 /// </summary> public void Destroy() { if (IsDestroyed) { return; } IsDestroyed = true; if (ActivityObject != null) { ActivityObject.RemoveComponent(this); } OnDestroy(); } internal void _SetActivityObject(ActivityObject activityObject) { ActivityObject = activityObject; } }