Как я могу повернуть проигрыватель в соответствии с нажатой позицией курсора мыши?

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

 void Update()
{
  MovePlayer();
}
  

Затем в первом оригинальном MovePlayer я действительно повернул проигрыватель, но под определенным углом, который я установил, например:

 private void MovePlayer()
    {
        if (Input.GetMouseButtonDown(0))
        {
            targetAngles = transform.eulerAngles   85.0f * Vector3.up;
            StartCoroutine(TurnObject(transform, transform.eulerAngles, targetAngles, smooth));
        }
    }
  

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

 private void MovePlayer()
    {
        if (Input.GetMouseButtonDown(0))
        {

            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                startPositon = hit.point;

                targetAngles = transform.eulerAngles   0 * Vector3.up;
                StartCoroutine(TurnObject(transform, transform.eulerAngles, targetAngles, smooth));
            }
        }
    }
  

И

 IEnumerator TurnObject(Transform ship, Vector3 startAngle, Vector3 endAngle, float smooth)
    {
        float lerpSpeed = 0;
        isSpinning = true;

        while (lerpSpeed < 1)
        {
            ship.eulerAngles = Vector3.Lerp(startAngle, endAngle, lerpSpeed);
            lerpSpeed  = Time.deltaTime * smooth;
            yield return null;
        }
        startPositon = ship.position;
        isSpinning = false;
    }
  

Это работает, но с некоторыми проблемами:

 void Update()
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit, 100000))
        {
            transform.LookAt(hit.point);
        }
    }
  

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

Вторая проблема заключается в том, что когда я навожу курсор мыши на себя, на корпус проигрывателя, он совершает несколько быстрых вращений на месте. Как я могу этого избежать? Или решить это?

Я попытался изменить строку:

 if (Physics.Raycast(ray, out hit, 100000))
  

Для

 if (Physics.Raycast(ray, out hit))
  

Но это не решило проблему. Возможно, проблема в том, что мое небо — это скайбокс, который я перетащил в окно сцены, поэтому это не объект.

Мой скайбокс — это материал, который я перетащил в окно сцены, так что, возможно, это проблема, я не могу повернуть проигрыватель, когда курсор мыши направлен в небо. Есть решение?

Комментарии:

1. Вы работаете с камерой от первого лица, камерой от третьего лица, камерой с высоты птичьего полета или …?

2. @Abion47 ThirdPersonController — это мой проигрыватель, а основная камера расположена просто позади проигрывателя, но она не дочерняя по отношению к проигрывателю, она находится в общей иерархии.

3. Мне удалось решить проблему при наведении курсора мыши на себя на проигрывателе. Я просто добавил эту строку перед строкой LookAt: если (hit.collider.name != «ThirdPersonController») теперь я должен решить проблему с небом.