using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// 角色,包括player和opponents
///
public partial class Avatar : MonoBehaviour, IInteractable
{
public string Name;
// 一个角色包括一个身体的collider和若干hitbox和hurtbox
public PhysicsBody m_Body;
public PhysicsBox m_BodyCollider;
public Hitbox[] m_Hitbox;
public Hurtbox[] m_Hurtbox;
public Transform m_Hips;
protected StateController m_StateController = new StateController();
// 预定义的state,角色必须定义的
protected StateBase m_StateLightHurt;
protected StateBase m_StateMidiumHurt;
protected StateBase m_StateHeavyHurt;
protected StateBase m_StateGroundHurt;
protected StateBase m_StateAirHurt;
public PhysicsBody Body
{
get
{
return m_Body;
}
}
public PhysicsPrimitive[] GetAllPrimitive()
{
throw new System.NotImplementedException();
}
protected void Init()
{
AvatarManager.Instance.AddAvatar(this);
}
public PhysicsBox GetHitbox()
{
throw new System.NotImplementedException();
}
public PhysicsBox GetHurtbox()
{
throw new System.NotImplementedException();
}
public PhysicsPrimitive[] GetAllHit()
{
throw new System.NotImplementedException();
}
public bool IsHit()
{
for (int i = 0; i < m_Hitbox.Length; ++i)
{
if (PhysicsWorld.Instance.HasCollision(m_Hitbox[i].Collider))
{
return true;
}
}
return false;
}
public bool IsHurt()
{
for (int i = 0; i < m_Hitbox.Length; ++i)
{
if (PhysicsWorld.Instance.HasCollision(m_Hurtbox[i].Collider))
{
return true;
}
}
return false;
}
public void OnUpdate()
{
m_StateController.OnUpdate();
}
// 在物理模拟之后调用
public void OnPhysicsUpdate()
{
m_StateController.OnPhysicsUpdate();
}
public virtual Vector3 GetEffectPosition()
{
return Vector3.zero;
}
// 获得当前击打如果有的话
public Hit GetHit()
{
return m_StateController.GetHit();
}
public virtual void OnHit(HitInfo hitInfo)
{
//Debug.Log("Hit");
m_StateController.OnHit(hitInfo);
}
public virtual void OnHurt(HurtInfo hurtInfo)
{
//Debug.Log("Hurt");
HitDefination hitDef = hurtInfo.hitDef;
if (hitDef != null)
ApplyHit(hitDef);
m_StateController.OnHurt(hurtInfo);
}
protected ConditionBase Not(ConditionBase cond)
{
return new ConditionNot(cond);
}
protected ConditionBase And(ConditionBase c1, ConditionBase c2)
{
return new ConditionAnd(c1, c2);
}
protected ConditionBase Ands(params ConditionBase[] cond)
{
List conditions = new List();
for (int i = 0; i < cond.Length; ++i)
{
conditions.Add(cond[i]);
}
ConditionMultiAnd and = new ConditionMultiAnd(conditions);
return and;
}
protected ConditionBase Or(ConditionBase c1, ConditionBase c2)
{
return new ConditionOr(c1, c2);
}
}