#c# #unity3d
#c# #unity3d
Вопрос:
Объект относится к типу спутника, поэтому у меня есть скрипт для перемещения объекта по орбите, используя его положение. И у меня также есть скрипт для перемещения объекта-спутника в режиме от первого лица.
Проблема в том, что пользователь не может перемещать камеру по осям «Мышь X» и «Мышь Y» для режима от первого лица. Проблема возникает из-за того, что сценарий orbit и сценарий от первого лица управляют камерой, поэтому она не может перемещаться. В игре, когда вы перемещаете мышь, вы видите, как камера дергается, и когда я отключаю сценарий орбиты, работает первый человек.
Как я могу решить эту проблему?
Решением может быть использование только положения для орбиты и поворота для управления от первого лица?? Режим от первого лица не будет управлять положением объектов, только вращением. Орбита не будет контролировать только положение вращения объектов.
Спасибо!
Сценарий орбиты
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;
}
}
Этот элемент управления режимом просмотра сверху работает со скриптом Orbit, но вид сверху не использует те же элементы управления, что и от первого лица, но я не могу понять, почему один работает, а другой нет.
Управление режимом просмотра сверху (работает с 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);
}
}
Ответ №1:
Насколько я понимаю, ваша проблема вызвана тем, что два скрипта пытаются установить поворот для одного и того же объекта: камеры. Если это так, вы можете создать пустой Satellite
объект и сделать камеру дочерним элементом этого объекта в иерархии. Прикрепление сценария орбиты к Satellite
объекту и сценария от первого лица к камере позволит камере перемещаться по орбите спутника, но при этом иметь собственное независимое вращение.
Редактировать:
Чтобы приспособить 3D-модель в этой ситуации, создайте пустой родительский объект с именем SatteliteWrapper
(или что-то подобное) и прикрепите сценарий орбиты к этому объекту. Затем сделайте камеру дочерней для SatteliteWrapper
и сделайте 3D-модель дочерней для камеры. Это позволяет модели вращаться вместе с камерой.
Комментарии:
1. Да, но мне все еще нужно, чтобы объекты спереди были направлены прямо на камеру
2. Вы имеете в виду, что у вас есть 3D-модель для спутника? В этом случае вы должны создать пустой родительский объект с именем
SatteliteWrapper
или что-то подобное и прикрепить сценарий орбиты к этому объекту. Затем вы должны сделать камеру дочерней дляSatteliteWrapper
и сделать 3D-модель дочерней для камеры. Описывает ли это вашу ситуацию? Если это так, я обновлю свой ответ.3. Я отредактировал свой первоначальный ответ, чтобы включить предыдущий комментарий. Если сейчас все работает, пожалуйста, подумайте о том, чтобы отметить мой ответ как принятый.
4. Объект satellite становится невидимым, когда я делаю его дочерним элементом камеры?
5. Возможно ли, что вместо того, чтобы становиться невидимой, она просто перемещается куда-то еще? Я бы проверил координаты спутника в инспекторе и убедился, что позиция остается нулевой. Также не должно быть никаких скриптов, прикрепленных к самому спутнику, только к оболочке и камере. Также дважды проверьте, на каком уровне находится спутник.