坦克(1) 移動控制
參數
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.紅色圈是兩個施力點
留言列表