unity3d-攻击移动

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);
            }
        }
 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。