144 lines
3.5 KiB
C#
144 lines
3.5 KiB
C#
// Felix-Bang:FBMonster
|
||
// へ /|
|
||
// /\7 ∠_/
|
||
// / │ / /
|
||
// │ Z _,< / /`ヽ
|
||
// │ ヽ / 〉
|
||
// Y ` / /
|
||
// イ● 、 ● ⊂⊃〈 /
|
||
// () へ | \〈
|
||
// >ー 、_ ィ │ //
|
||
// / へ / ノ<| \\
|
||
// ヽ_ノ (_/ │//
|
||
// 7 |/
|
||
// >―r ̄ ̄`ー―_
|
||
// Describe:怪物
|
||
// Createtime:2018/10/15
|
||
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace FBApplication
|
||
{
|
||
public class FBMonster : FBRole
|
||
{
|
||
#region 常量
|
||
public const float CLOSEDDISTANCE = 0.1f;
|
||
#endregion
|
||
|
||
#region 事件
|
||
public event Action<FBMonster> ReachedAction;
|
||
#endregion
|
||
|
||
#region 字段
|
||
|
||
[SerializeField]
|
||
MonsterType f_type = MonsterType.Monster0;
|
||
float f_moveSpeed; //移动速度
|
||
Vector3[] f_path=null; //路径拐点
|
||
int f_pathIndex = -1; //下一拐点索引
|
||
bool f_isReached = false; //是否到达终点
|
||
|
||
#endregion
|
||
|
||
#region 属性
|
||
public float MoveSpeed
|
||
{
|
||
get { return f_moveSpeed; }
|
||
set
|
||
{
|
||
f_moveSpeed = value;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region Unity回调
|
||
void Update ()
|
||
{
|
||
if (f_isReached)
|
||
return;
|
||
|
||
Vector3 pos = transform.position;
|
||
Vector3 dest = f_path[f_pathIndex + 1];
|
||
float dis = Vector3.Distance(pos,dest);
|
||
|
||
if (dis < CLOSEDDISTANCE)
|
||
{
|
||
MoveTo(dest);
|
||
|
||
if (HasNext())
|
||
MoveNext();
|
||
else
|
||
{
|
||
f_isReached = true;
|
||
|
||
//触发到达终点的事件
|
||
if (ReachedAction != null)
|
||
ReachedAction(this);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Vector3 direction = (dest - pos).normalized;
|
||
transform.Translate(direction * f_moveSpeed * Time.deltaTime);
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 事件回调
|
||
public override void OnSpawn()
|
||
{
|
||
base.OnSpawn();
|
||
FBMonsterInfo info = FBGame.Instance.StaticData.GetMoster(f_type);
|
||
MaxHP = info.HP;
|
||
HP = info.HP;
|
||
MoveSpeed = info.MoveSpeed;
|
||
}
|
||
|
||
public override void OnUnspawn()
|
||
{
|
||
base.OnUnspawn();
|
||
f_moveSpeed = 0;
|
||
f_path = null;
|
||
f_pathIndex = -1;
|
||
f_isReached = false;
|
||
ReachedAction = null;
|
||
}
|
||
#endregion
|
||
|
||
#region 方法
|
||
public void OnLoad(Vector3[] path)
|
||
{
|
||
f_path = path;
|
||
MoveNext();
|
||
}
|
||
|
||
private bool HasNext()
|
||
{
|
||
return f_pathIndex + 1 < f_path.Length - 1;
|
||
}
|
||
|
||
private void MoveNext()
|
||
{
|
||
if (!HasNext())
|
||
return;
|
||
|
||
if (f_pathIndex == -1)
|
||
{
|
||
f_pathIndex = 0;
|
||
MoveTo(f_path[f_pathIndex]);
|
||
}
|
||
else
|
||
f_pathIndex++;
|
||
}
|
||
|
||
private void MoveTo(Vector3 position)
|
||
{
|
||
transform.position = position;
|
||
}
|
||
#endregion
|
||
}
|
||
}
|