Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / Component.cs
@小李xl 小李xl on 18 Oct 2022 3 KB 重构throwNode, 目前还有点bug

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;
    }
}