//write by shadow using UnityEngine; using System.Collections; public class TankBehaviour : MonoBehaviour { private const float minMoveCheck=0.2f; public int groupId=0;//组 id public float moveSpeed=5, rotateSpeed=20;//移动旋转速度 public Vector3 position{ get{return transform.position;} } public Vector3 movement{ get{return myMovement;} } private Vector3 myMovement=Vector3.zero; private TankGroup myGroup; private float tgtSpeed=0, speed=0, currentSpeed; public void SetGroup(int index){ myGroup=TankGroup.GetTankGroup(index); } // Use this for initialization void Start () { //SetGroup(groupId); } private void OnEnable() { SetGroup(groupId); } private void ondis() { } // Update is called once per frame void Update () { //if (myGroup == null) //{ // return; //} Vector3 displacement=myGroup.targetPosition-position;//获取目标距离 Vector3 direction=displacement.normalized*myGroup.targetWeight;//方向*权重 if(displacement.magnitude<myGroup.targetCloseDistance)//重新计算目的地距离权重 direction*=displacement.magnitude/myGroup.targetCloseDistance; direction+=GetGroupMovement();//获取周围组的移动 if((myGroup.targetPosition-position).magnitude<minMoveCheck)//计算移动速度 tgtSpeed=0; else tgtSpeed=moveSpeed; speed=Mathf.Lerp(speed,tgtSpeed,2*Time.deltaTime); Drive(direction, speed);//移动 } private Vector3 GetGroupMovement(){ Collider[] c=Physics.OverlapSphere(position,myGroup.keepDistance,myGroup.mask);//获取周围成员 Vector3 dis,v1=Vector3.zero, v2=Vector3.zero; for(int i=0; i<c.Length; i++){ TankBehaviour otherTank=c[i].GetComponent<TankBehaviour>(); dis=position-otherTank.position;//距离 v1+=dis.normalized*(1-dis.magnitude/myGroup.keepDistance);//查看与周围单位的距离 v2+=otherTank.movement;//查看周围单位移动方向 Debug.DrawLine(position, otherTank.position, Color.yellow); } return v1.normalized*myGroup.keepWeight+v2.normalized*myGroup.moveWeight;//添加权重因素 } private void Drive(Vector3 direction, float spd){ Vector3 finialDirection=direction.normalized; float finialSpeed=spd, finialRotate=0; float rotateDir=Vector3.Dot(finialDirection,transform.right); float forwardDir=Vector3.Dot(finialDirection,transform.forward); if(forwardDir<0) rotateDir=Mathf.Sign(rotateDir); if(forwardDir<-0.2f) finialSpeed=Mathf.Lerp(currentSpeed,-spd*8,4*Time.deltaTime); if(forwardDir<0.98f)//防抖 finialRotate=Mathf.Clamp(rotateDir*180,-rotateSpeed, rotateSpeed); finialSpeed*=Mathf.Clamp01(direction.magnitude); finialSpeed*=Mathf.Clamp01(1-Mathf.Abs(rotateDir)*0.8f); transform.Translate(Vector3.forward*finialSpeed*Time.deltaTime); transform.Rotate(Vector3.up*finialRotate*Time.deltaTime); currentSpeed=finialSpeed; myMovement=direction*finialSpeed; } }