球员运动与速度

时间:2017-09-28 07:03:34

标签: c# game-physics

我有一个小问题。我有一个附加到GameObject的脚本,然后我可以以一定的速度上下控制对象。我希望运动有点惯性,也就是更加真实。这是我的代码:

float moveSpeed = 5f;
void Update()
{
    float y = Input.GetAxisRaw("Vertical");
    Vector2 direction = new Vector2(0, y).normalized;
    Move(direction);
}

void Move(Vector2 direction)
{
    Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0));
    Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1));
    Vector2 pos = transform.position;       
    pos += direction * moveSpeed * Time.deltaTime;
    pos.y = Mathf.Clamp(pos.y, min.y, max.y);
    transform.position = pos;       
}

此代码有效,但似乎不真实,添加一些惯性或速度会很好。求救!

2 个答案:

答案 0 :(得分:1)

如果你想改变速度,你需要改变moveSpeed(这是你的速度),而不仅仅是方向。

float moveSpeed = 0f;
// modify this to change how your intertia looks like
float frictionValue = 1f;
void Update()
{
  float y = Input.GetAxisRaw("Vertical");
  moveSpeed += y * Time.deltaTime;
  Move();
  moveSpeed = Mathf.Lerp(moveSpeed, 0f, frictionValue * Time.deltaTime); 
}
void Move()
{
  Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0));
  Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1));
  Vector2 pos = transform.position;       
  pos.y += moveSpeed * Time.deltaTime;
  pos.y = Mathf.Clamp(pos.y, min.y, max.y);
  transform.position = pos;       
}

答案 1 :(得分:1)

应该是一个简单的解决方法:

不要立即从0加速到moveSpeed,而是使用Vector2.MoveTowards慢慢加速到目标速度。

public float moveSpeed = 5f;
public float acceleration = 1f;
private Vector2 moveDirection = Vector2.zero;

void Update()
{
    float y = Input.GetAxisRaw("Vertical");
    Vector2 direction = new Vector2(0, y).normalized;
    Move(direction);
}

void Move(Vector2 direction)
{
    moveDirection = Vector2.MoveTowards(moveDirection, direction, 
        acceleration * Time.deltaTime);

    Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0));
    Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1));
    Vector2 pos = transform.position;
    pos += moveDirection * moveSpeed * Time.deltaTime;
    //pos.y = Mathf.Clamp(pos.y, min.y, max.y);
    transform.position = pos;
}