#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 в качестве альтернативы, которая может вам подойти. Кроме того, не забывайте, что у вас может быть свой собственный контроллер для настройки настраиваемого положения совместной цели (в мировых единицах возможно, см. Нижний параметр, чтобы включить его)