Как сделать так, чтобы объект зависал в центре дисплея?

#unity3d #object #camera #hover

#unity3d #объект #камера #наведите курсор

Вопрос:

Я создаю игру от первого лица, и я хочу поместить объект (например, бабочку) в центр поля зрения игрока и позволить объекту зависнуть.

Итак, я поместил emptyobject как дочерний элемент Camera и расположил (0,0,10), а также поместил объект как дочерний элемент emptyobject и расположил (0,0,0). Таким образом, I объект находится на (0,0,10) камеры относительно.

Затем я запрограммировал, чтобы объект перемещался в случайном направлении в конечной границе, когда таймер становится равным назначенному интервалу.

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

То, что я хочу, — это наведение курсора объекта на конечную границу, чтобы пользователь всегда видел объект во время игры. Но объект выходит за пределы границы, как только он перемещается один или два раза.

Я надеюсь, вы дадите мне знать, в чем причина этой проблемы.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hovering : MonoBehaviour
{
    // WanderRange : Maximum Range an object can wander from center
    [Range(0, 5)]
    public float WanderRange;

    // WanderRadius : Range an object can wander at one time.
    [Range(0,1)]
    public float WanderRadius;

    // WanderTime : Time an object make should move
    [Range(0,5)]
    public float WanderTime;

    private float timer;
    private float moveSpeed = 0.5f;

    public CharacterController characterController;

    // presentLocation : Present location of object is.
    private Vector3 presentLocation;
    // moveVelocity : direction and displacement of object..
    private Vector3 moveVelocity;
    
    private void Awake()
    {
        characterController = GetComponent<CharacterController>();
    }

    private void Update()
    {
        presentLocation = transform.position;

        timer  = Time.deltaTime;

        // Get moveVelocity when timer get larger or same value than what user set
        if (timer >= WanderTime)
        {
            // Get moveVelocity Once
            moveVelocity = NextTargetFinder(presentLocation, WanderRadius);

            // If object seems to move further than range, make it should be in boundary area.
            if(Vector3.Magnitude(presentLocation   moveVelocity) >= WanderRange)
            {
                moveVelocity = Vector3.Normalize(moveVelocity);
                float relief = WanderRange - Vector3.Magnitude(presentLocation);
                moveVelocity *= relief;
            }
            
            //move Object
            characterController.Move(moveVelocity * moveSpeed * Time.deltaTime);
        }
    }

    public Vector3 NextTargetFinder(Vector3 present, float radius)
    {
        // Calculate random direction to move from present location
        Vector3 randDirection = Random.insideUnitSphere * radius;

        // To hold depth of object, delete z value.
        randDirection.z = 0;

        // return direction(Velocity)
        return randDirection;

    }

}
 

PS. Почему uv-координата объекта меняется при повороте камеры по оси x?

Ответ №1:

Самым простым подходом было бы использовать фиксированный шарнир:

https://docs.unity3d.com/Manual/class-FixedJoint.html

введите описание изображения здесь

Например, вы можете сделать так:

введите описание изображения здесь

Или вместо этого настраиваемое соединение, и вам не понадобится дополнительный объект:

введите описание изображения здесь

Вот настройки для этого:

введите описание изображения здесь

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

1. Спасибо за любезный ответ. Есть ли какой-нибудь способ удержать z-позицию объекта? Я хочу, чтобы объект перемещался в направлениях x и y.

2. Не уверен, что понимаю, но в любом случае, проверьте docs.unity3d.com/Manual/Constraints.html в качестве альтернативы, которая может вам подойти. Кроме того, не забывайте, что у вас может быть свой собственный контроллер для настройки настраиваемого положения совместной цели (в мировых единицах возможно, см. Нижний параметр, чтобы включить его)