日志2025.2.9

发布于:2025-02-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

日志2025.2.9

1.增加了敌人挥砍类型

2.增加了敌人的死亡状态
在敌人身上添加Ragdoll,死后激活布偶模式
public class EnemyRagdoll : MonoBehaviour
{
    private Rigidbody[] rigidbodies;
    private Collider[] colliders;

    private void Awake()
    {
        rigidbodies = GetComponentsInChildren<Rigidbody>();
        colliders = GetComponentsInChildren<Collider>();
        SetRagdollActive(false);
    }

    //如果是布偶状态,则设置钢铁不为运动学。若为正常状态,将刚体设为运动学
    public void SetRagdollActive(bool active)
    {
        foreach (Rigidbody rb in rigidbodies) 
        { 
            rb.isKinematic = !active;
        }
    }

    //设置碰撞体是否为激活状态
    public void SetColliderActive(bool active)
    {
        foreach(Collider collider in colliders) 
        { 
            collider.enabled = active;
        }
    }

}


public class DeadState_Melee : EnemyState
{
    private Enemy_Melee enemy;
    private EnemyRagdoll ragdoll;
    private bool hasDisapear;

    public DeadState_Melee(Enemy enemyBase, EnemyStateMachine stateMachine, string animBoolName) : base(enemyBase, stateMachine, animBoolName)
    {
        enemy = (Enemy_Melee)enemyBase;
    }

    public override void Enter()
    {
        base.Enter();
        enemy.agent.isStopped = true;
        enemy.animator.enabled = false;

        ragdoll = enemy.GetComponent<EnemyRagdoll>();
        if (ragdoll != null) 
        { 
            ragdoll.SetRagdollActive(true);
        }

        stateTimer = 5f;

    }

    public override void Exit()
    {
        base.Exit();
    }

    public override void Update()
    {
        base.Update();

        if(stateTimer < 0 && !hasDisapear)
        {
            hasDisapear = true;
            ragdoll?.SetColliderActive(false);
        }
    }
}


3.增加了简单的血量系统
    public override void GetHit()
    {
        base.GetHit();
        if(healthPoint <= 0)
            stateMachine.ChangeState(deadState);
    }


4.增加了带盾牌的特殊敌人
public class EnemyShield : MonoBehaviour
{
    [SerializeField] private int durability;
    private Enemy enemy;

    private void Awake()
    {
        enemy = GetComponentInParent<Enemy>();
    }

    public void ReduceDurability()
    {
        durability--;
        if(durability <= 0)
        {
            enemy.animator.SetFloat("ChaseIndex", 0);

            Destroy(gameObject);
        }
    }

}


    //初始化一些特殊的敌人功能
    private void InitializeSpeciality() 
    { 
        if(meleeType == EnemyType_Melee.Shield)
        {
            animator.SetFloat("ChaseIndex", 1);
            shieldTransform.gameObject.SetActive(true);
        }
    }