Объект относится к типу спутника, поэтому у меня есть скрипт для перемещения объекта по орбите, используя его положение. И у меня также есть скрипт для перемещения объекта спутника в режиме от первого лица.
Проблема в том, что пользователь не может перемещать камеру по оси "Мышь X" и "Мышь Y" для режима от первого лица. Проблема возникает из-за того, что сценарий орбиты и сценарий от первого лица управляют камерой, поэтому она не может двигаться. В игре, когда вы перемещаете мышь, вы видите рывок камеры, и когда я отключаю скрипт орбиты, работает первый человек.
Как я могу решить эту проблему?
Решением может быть использование только положения для орбиты и вращения для контроля от первого лица. Режим от первого лица не будет контролировать положение объектов только вращением. Орбита не будет контролировать только вращение объектов.
Спасибо!
Скрипт Орбиты
private void FixedUpdate()
{
transform.RotateAround(centerOfOrbit.position, orbitAxis, orbitSpeed * Time.deltaTime);
desiredOrbitPosition = (transform.position - centerOfOrbit.position).normalized * orbitRadius + centerOfOrbit.position;
transform.position = Vector3.MoveTowards(transform.position, desiredOrbitPosition, Time.deltaTime * orbitAdjustSpeed);
}
Управление режимом от первого лица (не работает с Orbit)
private void Update()
{
if(allowFirstPerson)
{
x+= Input.GetAxis ("Mouse X") * turnSpeed;
if (allowTiltingForward)
{
y -= Input.GetAxis("Mouse Y") * turnSpeed;
}
y = ClampAngle(y, minVerticalAngle, maxVerticalAngle);
if (minHorizontalAngle != 0 || maxHorizontalAngle != 0)
{
x = ClampAngle(x, minHorizontalAngle, maxHorizontalAngle);
}
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 direction = (rotation * Vector3.forward * 100);
aimPoint = new Vector3(direction.x + aimError, direction.y + aimError, direction.z + aimError);
aimDir = (aimPoint - playerCamera.transform.position).normalized;
}
}
Этот элемент управления режима Top View работает со сценарием Orbit, но вид сверху не использует те же элементы управления, что и от первого лица, но я не могу понять, почему один работает, а другой - нет.
Управление режимом Top View (работает с Orbit)
private void Update()
{
if(allowTopView)
{
Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
topDownAimPoint = new Vector3(0,0,0);
if(Physics.Raycast(ray, out hit))
{
topDownAimPoint = hit.point;
}
aimPoint = new Vector3(topDownAimPoint.x + aimError, topDownAimPoint.y + aimError, topDownAimPoint.z + aimError);
}
}
Насколько я понимаю, ваша проблема вызвана двумя сценариями, которые пытаются установить вращение для одного и того же объекта: камеры. В этом случае вы можете создать пустой объект Satellite
и сделать камеру дочерней по отношению к этому объекту в иерархии. Прикрепление сценария орбиты к объекту " Satellite
и сценария от первого лица к камере позволит камере перемещаться по орбите спутника, но при этом будет иметь свое собственное независимое вращение.
РЕДАКТИРОВАТЬ:
Чтобы приспособить 3d-модель в этой ситуации, создайте пустой родительский объект с именем SatteliteWrapper
(или что-то похожее) и присоедините сценарий орбиты к этому объекту. Затем сделайте камеру дочерним элементом SatteliteWrapper
и сделайте 3d-модель дочерним элементом камеры. Это позволяет модели вращаться вместе с камерой.
SatteliteWrapper
или что-то похожее и присоедините скрипт Orbit к этому объекту. Затем вы сделаете камеру дочерним элементомSatteliteWrapper
и сделаете 3d-модель дочерним элементом камеры. Описывает ли это вашу ситуацию? Если так, я обновлю свой ответ.