Объект Follow Mouse Draging Unity 3D - PullRequest
       0

Объект Follow Mouse Draging Unity 3D

0 голосов
/ 09 января 2019

У меня есть объект, постоянно движущийся вперед, я хочу, чтобы он двигался по оси X, перетаскивая мышью любую часть экрана (смахивание), поэтому я попробовал этот код, но при первом нажатии на экран объект переместился на положение мыши X (без перетаскивания) Есть ли у вас какие-либо предложения о том, как заставить его двигаться только при перетаскивании?

Сценарий:

private bool dragging = false;
private float distance;

public Rigidbody Ball;
public float Speed = 100;


// Use this for initialization
void Start () {

}

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

    Ball.velocity = transform.forward * Speed * Time.deltaTime;
}


void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        distance = Vector3.Distance(transform.position, Camera.main.transform.position);
        dragging = true;
    }

    if(Input.GetMouseButtonUp(0))
    {
        dragging = false;
    }

    if (dragging)
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 rayPoint = ray.GetPoint(distance);
        transform.position = new Vector3(rayPoint.x, transform.position.y, transform.position.z);
    }
}

1 Ответ

0 голосов
/ 09 января 2019

Для продолжения движения вы можете использовать GetMouseButton, который имеет значение true, пока кнопка остается нажатой (в отличие от GetMouseButtonDown, который имеет значение true только для первого кадра, на котором нажата кнопка)

Вы сказали, что скрипт присоединен к такому же компоненту RigiBody. В таком случае вы никогда не должны размещать объект, используя

transform.position = ...

, но вместо этого используйте RigidBody.MovePosition подобно

Ball.MovePosition(new Vector3( ... ));

Наконец, сохраните начальную позицию при наведении мыши и затем используйте ее в качестве контрольной точки:

Vector3 initialPosition;

void Update()
{
    // called the first time mouse button is pressed
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        initialPosition = transform.position;

        Vector3 rayPoint = ray.GetPoint(0);

        // Not sure but this might get you a slightly better value for distance
        distance = Vector3.Distance(transform.position, rayPoint );
    }

    // called while button stays pressed
    if (Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 rayPoint = ray.GetPoint(distance);
        Ball.MovePosition(initialPosition + new Vector3(rayPoint.x, 0, 0));
    }
}

Также обратите внимание, что я не уверен, что

// Update is called once per frame
void FixedUpdate () {
    Ball.velocity = transform.forward * Speed * Time.deltaTime;
}

это то, что вы хотите сделать. Использование Time.deltaTime не имеет особого смысла в моих глазах. Вы либо хотите установить скорость на определенную скорость, например

Ball.velocity = transform.forward * Speed;

или вы хотите изменить позицию, используя Time.deltaTime для плавного движения, например

Ball.MovePosition(transform.position + transform.forward * Speed * Time.deltaTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...