Files
Zombie/Assets/_Zombie/Scripts/Agent.cs

167 lines
4.0 KiB
C#

using System.Reflection;
using System;
using System.Collections;
using System.Collections.Generic;
using DragonLi.Frame;
using Mirror;
using Pathfinding;
using UnityEngine;
public class Agent : NetworkBehaviour, IDamagable
{
[Header("当前血量")]
#if UNITY_EDITOR
[DisplayOnly]
#endif
[SyncVar]
public float health = 0f;
[Header("原始血量")]
#if UNITY_EDITOR
[DisplayOnly]
#endif
[SyncVar]
public float originHealth = 0f;
/// <summary>
/// 血量
/// </summary>
public float Health
{
get
{
return health;
}
set
{
health = value;
health = Mathf.Clamp(health, 0f, originHealth);
OnHeathChanged(health);
}
}
/// <summary>
/// 是否存活
/// </summary>
public bool IsAlive => Health > 0f;
private Animator animatorComponent;
/// <summary>
/// 动画组件
/// </summary>
public Animator AnimatorComponent
{
get
{
if (animatorComponent == null)
{
animatorComponent = GetComponentInChildren<Animator>();
}
return animatorComponent;
}
}
private Collider colliderComponent;
/// <summary>
/// 碰撞组件
/// </summary>
public Collider ColliderComponent
{
get
{
if (colliderComponent == null)
{
colliderComponent = GetComponentInChildren<Collider>();
}
return colliderComponent;
}
}
private Rigidbody rigidbodyComponent;
/// <summary>
/// 刚体组件
/// </summary>
public Rigidbody RigidbodyComponent
{
get
{
if (rigidbodyComponent == null)
{
rigidbodyComponent = GetComponentInChildren<Rigidbody>();
}
return rigidbodyComponent;
}
}
/// <summary>
/// This will be called every frame
/// </summary>
public virtual void OnUpdate() { }
/// <summary>
/// On entity enable, this will be called when entity was being spawned.
/// </summary>
[Server]
public virtual void OnSpawn()
{
OnBorn();
}
/// <summary>
/// When this entity has been born
/// </summary>
public virtual void OnBorn() { }
/// <summary>
/// When agent receives damage this function will be called
/// If you want to re calculate damage you can do it here.
/// </summary>
/// <param name="value">How much</param>
/// <param name="info">Some information about this damage you want to tell damage receiver</param>
/// <param name="_sender">Who take this damage</param>
/// <returns></returns>
public virtual float OnReceiveDamage(float value, object info, Transform _sender)
{
return value;
}
/// <summary>
/// When health changed this function will be called
/// </summary>
/// <param name="currentHealth">current health</param>
public virtual void OnHeathChanged(float currentHealth) { }
/// <summary>
/// Add damage
/// </summary>
/// <param name="value">How much</param>
/// <param name="info">Some information about this damage you want to tell damage receiver</param>
/// <param name="_sender">Who take this damage</param>
[Server]
public virtual void ApplyDamage(float value, object info, Transform _sender)
{
// Debug.Log("造成伤害" + value);
if (IsAlive)
{
Health -= OnReceiveDamage(value, info, _sender);
if (!IsAlive)
{
Die(info, _sender);
}
}
}
/// <summary>
/// Let this entity die, and tell task system.
/// </summary>
public virtual void Die(object info, Transform _sender)
{
OnDeath(info, _sender);
}
/// <summary>
/// On entity die, this will be called, you can write despawn functions here.
/// </summary>
public virtual void OnDeath(object info, Transform _sender) { }
}