единство 2d нажмите, чтобы ходить

1
  1. Скорость зависит от расстояния от объекта до щелчка. Как это исправить?
  2. Как заблокировать движение (после щелчка) по оси y?

    public int speed;
    Vector3 position;
    bool go;
    
    void FixedUpdate ()
    {      
        if (Input.GetKey (KeyCode.Mouse0))
        {
            go=true;
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
            RaycastHit hit;
    
            if (Physics.Raycast (ray, out hit, Mathf.Infinity))
            {
                position = hit.point;
            }
        }
    
      //////////////////////////////////////////////////////////////////////
    
        if(go)
        {
            Vector2 direction = position - transform.position;
    
            float targ_pos = Vector2.Distance (transform.position, position);
    
            if(targ_pos>0)
            {
                rigidbody2D.AddForce ((position - transform.position)*speed);       
            }
            else {go=false;}
        }  
    }
    
  • 0
    Сила, которую вы сейчас добавляете, зависит от расстояния, которое вы пытаетесь «перевести». Вам нужно создать нормализованный вектор, а затем умножить его на скорость. Что касается пункта 2, в ваших жестких телах объектов вы можете динамически устанавливать ограничения движения, я думаю, это то, что вы ищете?
  • 0
    Спасибо за ответ. Я знаю о "нормализации", но я действительно новичок. ) Что-то вроде: solidbody2D.AddForce ((position - transform.position) .Normalize * speed); вызывает ошибки. Что касается пункта 2 (если вы писали о положении / повороте блокировки ограничений), эта функция доступна только для RigidBody (3D), но не для 2D.
Теги:
unity3d
unity3d-2dtools

1 ответ

0

Может быть, вы все еще ищете ответ, но это может помочь другим задуматься.

Я сделал игру, где персонаж переместился с помощью ClickToMove. Вот как я это сделал. Моя игра была 3D, поэтому вам, возможно, придется немного подкорректировать.

Мы храним точку, которую мы ударили, которая принадлежит к этажу моей сцены (floorHit). В верхней части моего класса я объявил Vector3 toGo. У моего игрока жесткая привязка к нему, и я поворачиваюсь к точке, которую он должен двигаться. Затем используйте MoveTowards (от, до, скорость);

if (Physics.Raycast (camRay, out floorHit, camRayLength, floorMask)) {

                Vector3 playerToMouse = floorHit.point - transform.position;

                // the quaternion defines the rotation, looking through the vector
                Quaternion newRotation = Quaternion.LookRotation (playerToMouse);
                playerRigidbody.MoveRotation (newRotation);

                toGo = floorHit.point; // We save the point we touched  }

Затем за пределами if, все еще находящегося в функции обновления, мы вызываем MoveTowards с сохраненным ранее toGo Vector3:

transform.position = Vector3.MoveTowards (transform.position, toGo, speed * Time.deltaTime);

Надеюсь, это поможет,

Кроме того, у меня есть код, если вы хотите оживить своего персонажа.

Не стесняйтесь просить больше,

BRO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню