一.创建怪物
对于怪物的功能我是把他分成三个脚本设计的:
1.怪物属性以及属性计算脚本,包括伤害b不buff等
2.怪物AI,包括怪物自动寻路,技能释放的时机,通过怪物的动画事件来触发技能效果等
3.怪物的技能效果,把技能效果做成一个函数封装起来,由AI来决定释放技能的动作,从而触发技能函数。
二.OnGUI显示伤害
public class DamageShow : MonoBehaviour
{
/// <summary>
/// 目标位置
/// </summary>
private Vector3 mTarget;
/// <summary>
/// 屏幕坐标
/// </summary>
private Vector3 mScreen;
/// <summary>
/// 伤害数值
/// </summary>
public int value;
/// <summary>
/// 文本宽度
/// </summary>
public float contentWidth = 100;
/// <summary>
/// 文本高度
/// </summary>
public float contentHeight = 50;
/// <summary>
/// GUI坐标
/// </summary>
private Vector2 mPoint;
/// <summary>
/// 销毁时间
/// </summary>
public float freeTime = 0.2f;
private void OnEnable()
{
}
void Update()
{
//使文本在重直方向山产生一个偏移
transform.Translate(Vector3.up * 5.0F * Time.deltaTime);
//重新计算坐标
mTarget = transform.position;
//狭取屏廉坐标
mScreen = Camera.main.WorldToScreenPoint(mTarget);
//将屏幕坐标转化为GUI坐标
mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);
}
void OnGUI()
{
//保证自标在摄像机前方
if (mScreen.z > 0)
GUI.color = Color.red;
GUI.skin.label.fontSize = 25;
//内部使用GUI坐标进行绘制
GUI.Label(new Rect(mPoint.x, mPoint.y, contentWidth, contentHeight), value.ToString());
StartCoroutine("Free");
}
IEnumerator Free(){
yield return new WaitForSeconds(freeTime);
PoolMgr.Instance.PushObject("Profabs/DamageShow", gameObject);
}
}
以前一直想用Invoke来调用有参数的函数一直没成功,然后想到了协程。