我正在根据GetAxis ("Vertical")
和速度修改器添加前进力normal max speed
。
我也允许“速度提升”,在boosted max speed
之前的正常添加力之上增加更多力量。
我正在经历的困难是在提升期结束后减慢对象的速度
所以基本上如果你的速度加快到正常的最大速度,你不能再加速提升速度,将物体减速回到正常的最大速度。
这是我到目前为止所得到的:
float velocity;
float magnitude = myRigidBody.velocity.magnitude;
float vertical = Input.GetAxis ("Vertical");
if (Input.GetKeyUp(KeyCode.LeftShift)) {
boost = false;
}
if (Input.GetKeyDown (KeyCode.LeftShift)) {
boost = true;
}
if (!boost) {
velocity = vertical * speed;
Vector3 force = myRigidBody.transform.forward * velocity;
if (magnitude + force.sqrMagnitude < normalMaxSpeed) {
myRigidBody.drag = 0f;
myRigidBody.AddForce (force, ForceMode.Impulse);
} else if (magnitude + force.sqrMagnitude >= maxTrust + 50) {
myRigidBody.drag = 1.5f;
}
} else if ( magnitude < boostedMaxSpeed) {
velocity = vertical * (speed + speedBoost);
myRigidBody.AddForce (myRigidBody.transform.forward * velocity, ForceMode.Impulse);
这有些有效,但除了改变阻力之外必须有更好的解决方案。
答案 0 :(得分:4)
除了更改阻力之外,还有其他方法可以做到这一点。你只需要试验看哪一个效果最好。
1 。更改拖动
myRigidBody.drag = 20f;
2 。以相反的速度加力。
public Rigidbody myRigidBody;
void FixedUpdate()
{
Vector3 oppositeVelocity = -myRigidBody.velocity;
myRigidBody.AddRelativeForce(oppositeVelocity);
}
3 。将当前速度减小或恢复到法向力。
public Rigidbody myRigidBody;
Vector3 normalForce;
void Start()
{
normalForce = new Vector3(50, 0, 0);
//Add force
myRigidBody.velocity = new Vector3(500f, 0f, 0f);
//OR
//myRigidBody.AddForce(new Vector3(500f, 0f, 0f));
}
void FixedUpdate()
{
//Go back to normal force within 2 seconds
slowDown(myRigidBody, normalForce, 2);
Debug.Log(myRigidBody.velocity);
}
bool isMoving = false;
void slowDown(Rigidbody rgBody, Vector3 normalForce, float duration)
{
if (!isMoving)
{
isMoving = true;
StartCoroutine(_slowDown(rgBody, normalForce, duration));
}
}
IEnumerator _slowDown(Rigidbody rgBody, Vector3 normalForce, float duration)
{
float counter = 0;
//Get the current position of the object to be moved
Vector3 currentForce = rgBody.velocity;
while (counter < duration)
{
counter += Time.deltaTime;
rgBody.velocity = Vector3.Lerp(currentForce, normalForce, counter / duration);
yield return null;
}
isMoving = false;
}
4 。更改Physics Material的动态摩擦。你不能使用这种方法,因为它需要你没有的对撞机。
//Get the PhysicMaterial then change its dynamicFriction
PhysicMaterial pMat = myRigidBody.GetComponent<Collider>().material;
pMat.dynamicFriction = 10;
实验并决定哪一个最适合您。根据您制作的游戏类型,它们很有用。例如,#4 主要用于滚球,因为它使用需要频繁碰撞的物理材料来实际工作。
#3 中使用的方法可让您控制转换应发生的时间。如果你需要控制它那么那就是选择。