close

  坦克(1) 移動控制dfsfsfsdf  

 

參數

const float cMass=1000f;
 /// <summary>
 /// 運動阻力,受力移動時物體受到的空氣阻力

 /// </summary>
 const float cDrag=0.1f;
 /// <summary>
 /// 當受扭力旋轉時物體受到的空氣阻力
 /// </summary>
 const float cAngularDrag=0.8f;
 /// <summary>
 /// 引擎力量
 /// </summary>
 const float cPower = 10000f;
 /// <summary>
 /// 右邊第1顆輪子的localPosition
 /// </summary>
 Vector3 cWheelCollidersPos =new  Vector3(1.6f,-0.4f,2.5f);
 Rigidbody mRigidbody;

 

初始化:

 

if(mRigidbody==null)
  {
   mRigidbody=this.gameObject.AddComponent<Rigidbody>();

  }
  
  mRigidbody.mass=cMass;
  mRigidbody.drag = cDrag;
  mRigidbody.angularDrag =cAngularDrag;
  //当你发现刚体运动时抖动,平滑本帧变换
  mRigidbody.interpolation = RigidbodyInterpolation.Interpolate;

 

FixedUpdate()內的處理:

 

float motor = 0.0f;
  float steer = 0.0f;
  float l=0f;
  float r=0f;
  motor = Input.GetAxis("Vertical");//上下
  steer = Input.GetAxis("Horizontal");//左右
  l = motor;
  r = motor;
  l += steer;
  r -= steer;

  
  /*
   * 在位置上添加力:
   * AddForceAtPosition (力 : Vector3,施力點 : Vector3(世界作標))
   * transform.forward 在世界空间坐标变换的蓝色轴。也就是z轴。
   * transform.up 在世界空间坐标变换的绿色轴。也就是y轴
   * transform.right 在世界空间坐标变换的红色轴。也就是x轴
   * transform.up*cWheelCollidersPos.y
   * transform.right*cWheelCollidersPos.x
   * 前進時,l=1,r=1;後退時,l=-1,r=-1,左轉r=1,l=0或右轉時l=1,r=0
   *
   * */
  
  mRigidbody.AddForceAtPosition
  (
   transform.forward*r*cPower,
   transform.position
   +
   transform.up*cWheelCollidersPos.y+transform.right*cWheelCollidersPos.x
  );//施力點1

  
  mRigidbody.AddForceAtPosition
  (
   transform.forward*l*cPower,
   transform.position
   +
   transform.up*cWheelCollidersPos.y -transform.right*cWheelCollidersPos.x
  );//施力點2

 

 

AddForceAtPosition這個API的第2個參數是施力點的位置,在坦克裡是施力於左右的紅圈圈如下圖所指.原地轉彎時只會有1邊施力,前進的話就給與相同的力.cWheelCollidersPos是該右邊第1輪的實際localPasition.紅色圈是兩個施力點

fgfgdfgr

 

 

arrow
arrow
    全站熱搜

    GABY 發表在 痞客邦 留言(0) 人氣()