1. 首先是人物的挂载文件
// 定义变量
private Transform AttackTarget = null; // 攻击目标 private Vector2 MoveDistance = new Vector2 (5, 8); //攻击后向后的移动距离 private Vector2 MoveDirector = new Vector2 (-60, 60);// 攻击后相对目标的移动角度 bool moveFlag = false; // 是否移动控制变量 Vector3 m_refFix = Vector3.zero; Vector3 moveToPos = Vector3.zero; // 计算后的移动位置 float m_refcomSmoothTime = 2.0f; // 移动所需要的时间
// 对外接口1 攻击目标的设定
public void SetTargetTrans(Transform target)
{
this.AttackTarget = target;
}
// 攻击后移动的位置设置
void setMosterMoveTo ()
{
if (this.AttackTarget == null) return;
float distance = UnityEngine.Random.Range (MoveDistance.x, MoveDistance.y);
float angle = UnityEngine.Random.Range (MoveDirector.x, MoveDirector.y);
Quaternion r= AttackTarget.rotation;
Quaternion r0= Quaternion.Euler(AttackTarget.rotation.eulerAngles.x,AttackTarget.rotation.eulerAngles.y + angle, AttackTarget.rotation.eulerAngles.z);
Vector3 movePos = (AttackTarget.position + (r0 *Vector3.forward) * distance);
if(Vector3.Distance(transform.position , AttackTarget.position) < 20 )
{
moveFlag = true;
moveToPos = movePos;
AttackTarget.LookAt (this.transform.position);
}
}
// 攻击后移动的位置移动
void setMoving ()
{
if(moveFlag == true)
{
transform.position = Vector3.SmoothDamp(transform.position, moveToPos, ref m_refFix, m_refcomSmoothTime);
m_refcomSmoothTime -= Time.deltaTime;
if(m_refcomSmoothTime <= 0)
{
m_refcomSmoothTime = 2.0f;
moveFlag = false;
this.transform.position = moveToPos;
moveToPos = Vector3.zero;
if(AttackTarget != null)
{
AttackTarget.LookAt(this.transform.position);
}
}
if(AttackTarget != null)
{
this.transform.LookAt (AttackTarget.position);
}
}
}
2. 移动的Status控制
private void FixedUpdate()
{
StateUpdate();
}
void StateUpdate()
{
if(moveFlag == true)
setMoving();
if(AttackTarget != null)
{
if(CurrentState == CharacterAnimationStates.Attack)
setMosterMoveTo();
}
else
{
moveFlag = false;
}
// 根据status Animation变更
OnStateChanged(new CharacterAnimationStateChangedEventArgs(previousState, newState));
}
3. Update 中人物正常移动的AI
// 人物的正常移动AI
public void Update()
{
float step = motionSpeed * Time.deltaTime;
var motionDir = LookTarget - transform.position;
if(motionDir.magnitude > Mathf.Epsilon)
{
var lookTowards = Quaternion.LookRotation(motionDir);
transform.rotation = Quaternion.Slerp(transform.rotation, lookTowards, step);
}
if (CanMove)
{
var newPos = Vector3.MoveTowards(transform.position, Target, step);
transform.position = new Vector3(newPos.x, transform.position.y, newPos.z);
var d = Vector3.Distance(newPos, Target);
if (d <= 1.0f && isMoving)
{
isMoving = false;
OnReachedMoveTarget(EventArgs.Empty);
}
}
}
原文:http://www.cnblogs.com/liusj/p/4045473.html