Unity Rigidbody Нажмите, чтобы переместить

Я хочу иметь скрипт, который, когда я щелкаю в моей сцене, мой игрок будет вращаться, и к нему будет добавлена ​​сила, и он будет перемещаться, пока не достигнет точки щелчка в моей сцене.

Прямо сейчас он работает с использованием векторов и перемещает игрока из одной точки в другую. Но я хочу исправить это, чтобы я мог использовать физику и лучше понимать, как движется мой игрок. Например, пусть он ускорится, чтобы начать движение, и замедлится, когда он достигнет моей цели.

Мой сценарий теперь выглядит так

public GameObject isActive;
public float speed;
public Ray ray;
public Rigidbody rigidBody;



public Vector3 targetPoint;
// Use this for initialization
void Start ()
{
    targetPoint = transform.position;
}

// Update is called once per frame
void Update ()
{


}

void FixedUpdate()
{
    if (Input.GetMouseButton(0)) 
    {
        targetPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
        ChangeRotationTarget ();
    }

    Quaternion targetRotation = Quaternion.LookRotation (targetPoint - transform.position);
    transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, speed * Time.deltaTime);

    rigidbody.position = Vector3.Lerp(transform.position, targetPoint, speed * Time.fixedDeltaTime);
}


void ChangeRotationTarget ()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Plane playerPlane = new Plane (Vector3.up, transform.position);

    float hitdist = 0.0f;

    if (playerPlane.Raycast (ray, out hitdist))
    {

        targetPoint = ray.GetPoint (hitdist);
    }

}

Однако, когда я запускаю это, он просто скользит из одной точки в другую. Независимо от силы сопротивления или массы, которую я вложил в свое твердое тело.

Может ли кто-нибудь помочь мне внести изменения? Или укажи мне в правильном направлении


person Sean    schedule 29.04.2015    source источник


Ответы (2)


У меня не было времени проверить это, но это должно быть почти то, что вы ищете. Просто примените к нему свои коды Quaternion и Rotation.

void FixedUpdate() {

    if (Input.GetMouseButton(0))
    {
        targetPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        if (rigidBody.position != targetPoint)
        {
            reachedTargetPoint = false;
            if (reachedTargetPoint == false)
            {
                GetComponent<Rigidbody>().AddForce(speed);
            }
        }

        //zoneBeforeReachingTP should be how much units before reaching targetPoint you want to start to decrease your rigidbody velocity
        if (rigidBody.position == (targetPoint - zoneBeforeReachingTP))
        {
            //speedReductionRate should be how much of speed you want to take off your rigidBody at the FixedUpdate time rate
            rigidBody.velocity = speedReductionRate;
        }
            if(rigidBody.position == targetPoint)
            {
                rigidBody.velocity = new Vector3(0, 0, 0);
                reachedTargetPoint = true;
            }
            ChangeRotationTarget();
        }  
    }
person ronald677br    schedule 26.11.2016
comment
Интересно, но код кажется немного неработающим ... if (completedTargetPoint == false) {} всегда будет ложным, поскольку вы устанавливаете его в строке выше. Но пытаюсь понять, как пользоваться логикой :) - person Niclas; 07.12.2017
comment
Ага! Извините за ошибку! У меня действительно не было времени это проверить, но вы правы! - person ronald677br; 30.12.2017

Это потому, что вы изменяете rigidbody.position, и ваша логика отменяет физику. Вместо этого вам нужно ApplyForce каждый физический фрейм, возможно, с ForceMode.Force или ForceMode.Acceleration.

person Max Yankov    schedule 30.04.2015