首页 > 代码库 > unity3d-攻击移动

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

// 人物的正常移动AIpublic 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);            }        } }

 

unity3d-攻击移动