Question by
Igor_Vasiak · Apr 21, 2017 at 04:11 PM ·
movementtime.deltatimetimescaleissuesspeed issues
AddForce with speed variations doesn't works properly?
I have a C# script where I set using AddForce () the moving speed for my player, and a script that makes it possible to upgrade the speed during game. The issue is: when I make a reference from a script to another, and Play my game, my player does not move as fast as he should! This is the script:
private Rigidbody rbody;
private CanWalk canWalk;
[SerializeField]private float speed = 5000f;
[SerializeField]private float angularSpeed;
[SerializeField]private float speedMultiplier;
[SerializeField]private float speedDivisor;
[SerializeField]private KeyCode runButton;
[SerializeField]private KeyCode crowtchButton;
private float inputV;
public bool invertVertical;
private float moveZ;
private bool cheat;
private bool speedUpgrade;
public bool SpeedUp {get {return speedUpgrade;} set {speedUpgrade = value;}}
void FixedUpdate ()
{
rbody = GetComponent<Rigidbody>();
canWalk = GetComponent<CanWalk>();
if (speedUpgrade)
AddSpeed ();
if (canWalk.CanMove)
{
if (GameObject.FindGameObjectWithTag ("CodeInput").GetComponent<Text> ().text == "#SPDx2=true")
cheat = true;
if (GameObject.FindGameObjectWithTag ("CodeInput").GetComponent<Text> ().text == "#SPDx2=false")
cheat = false;
if (!invertVertical) {inputV = Input.GetAxis("Vertical");}
if (invertVertical) {inputV = -Input.GetAxis("Vertical");}
if (cheat) {
if (!Input.GetKey (runButton) && !Input.GetKey (crowtchButton)) {
moveZ = inputV * speed * 2 * Time.fixedDeltaTime;
}
if (Input.GetKey (runButton) && !Input.GetKey (crowtchButton)) {
moveZ = inputV * speed * speedMultiplier * 2 * Time.fixedDeltaTime;
}
if (Input.GetKey (crowtchButton) && !Input.GetKey (runButton)) {
moveZ = inputV * speed / speedDivisor * 2 * Time.fixedDeltaTime;
}
if (Input.GetKey (crowtchButton) && Input.GetKey (runButton)) {
moveZ = inputV * speed * 2 * Time.fixedDeltaTime;
}
}
else if (!cheat) {
if (!Input.GetKey (runButton) && !Input.GetKey (crowtchButton)) {
moveZ = inputV * speed * Time.fixedDeltaTime;
}
if (Input.GetKey (runButton) && !Input.GetKey (crowtchButton)) {
moveZ = inputV * speed * speedMultiplier * Time.fixedDeltaTime;
}
if (Input.GetKey (crowtchButton) && !Input.GetKey (runButton)) {
moveZ = inputV * speed / speedDivisor * Time.fixedDeltaTime;
}
if (Input.GetKey (crowtchButton) && Input.GetKey (runButton)) {
moveZ = inputV * speed * Time.fixedDeltaTime;
}
}
print (Time.timeScale.ToString ());
rbody.velocity = new Vector3(0,rbody.velocity.y,0);
if (inputV != 0)
{rbody.AddForce(transform.forward * moveZ * Time.fixedDeltaTime, ForceMode.Force);}
}
}
void AddSpeed ()
{
speed += 100;
Save ();
speedUpgrade = false;
}
public void Save ()
{
PlayerPrefs.SetFloat ("FBSpeed", speed);
}
public void Load ()
{
speed = PlayerPrefs.GetFloat ("FBSpeed", 12000f);
}
The speed calcule is, basically one of three, with some variants:
moveZ = 1 x 12000f x 0.02; moveZ = 240;
moveZ = -1 x 12000f x 0.02; moveZ = -240;
moveZ = 0 x 12000f x 0.02; moveZ = 0;
I use a external script to access the AddSpeed void. Can't find where I am wrong. Help?
Comment
Just an add-on: if you multiply the speed value by 10 it almost works.