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

public class FollowMe : MonoBehaviour
{
    public GameObject menuCanvas;
    public Camera FirstPersonCamera;
    [Range(0, 1)]
    public float smoothFactor = 0.5f;

// how far to stay away fromt he center

    public float offsetRadius   = 0.3f;
    public float distanceToHead = 4;

    public  void Update()
    {
        // make the UI always face towards the camera
        menuCanvas.transform.rotation = FirstPersonCamera.transform.rotation;

        var cameraCenter = FirstPersonCamera.transform.position + FirstPersonCamera.transform.forward * distanceToHead;

        var currentPos = menuCanvas.transform.position;

        // in which direction from the center?
        var direction = currentPos - cameraCenter;

        // target is in the same direction but offsetRadius
        // from the center
        var targetPosition = cameraCenter + direction.normalized * offsetRadius;

        // finally interpolate towards this position
        menuCanvas.transform.position = Vector3.Lerp(currentPos, targetPosition, smoothFactor);
    }
}

К сожалению, холст мерцает перед камерой, и он неправильно расположен. Как мне сделать меню, чтобы следить за камерой?

0
user6038900 5 Фев 2020 в 16:58

2 ответа

Лучший ответ

Если для этого нет причин, вы можете использовать ScreenSpace - Camera холст, как указано в документах. Затем вы можете ссылаться на вашу камеру FPS как на камеру рендеринга для холста.

0
schneebuzz 5 Фев 2020 в 15:12

Простой способ сделать это - использовать экранное пространство - режим камеры, который можно настроить из компонента Canvas и в свойствах режима рендеринга.

Второй способ: если вам нужен больший контроль над тем, как должен вести себя ваш холст, вы можете использовать Canvas Render Mode - «World Space», а затем с помощью скрипта вы можете обрабатывать холст некоторого игрового объекта.

1
Dhumil Dholiya 5 Фев 2020 в 16:11