#c# #unity3d #3d
Вопрос:
это мой первый пост на StackOverflow, так что извините, если я задаю вопрос не в том месте или что-то в этом роде. Я следил за учебником: https://www.youtube.com/watch?v=Q56quIB2sOg и сделал вторую часть под названием «Оружие Ik». Я делаю игру 2.5 d, мой персонаж правильно целится и правильно двигает верхнюю часть позвоночника, когда смотрит вправо, но когда смотрит влево, персонаж начинает сходить с ума. Работает в правильном направлении, не работает, когда обращен влево. Я поворачиваю свой плеер с помощью простого скрипта, который устанавливает поворот y на 180. Вот мой код для скрипта Ik оружия:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class WeaponIK1 : MonoBehaviour
{
[SerializeField] Vector3 targetVector;
[SerializeField] Transform aimTransform;
[SerializeField] Transform spine2;
[SerializeField] int iterations = 10;
public float angleLimit = 90;
public float distanceLimit = 1.5f;
void Update()
{
targetVector = ShootPortal.mousePosition;
targetVector = new Vector3(0, targetVector.y, targetVector.z);
//Debug.Log(targetTransform);
}
Vector3 GetTargetPosition()
{
Vector3 targetDirection = targetVector - aimTransform.position;
Vector3 aimDirection = aimTransform.forward;
float blendOut = 0;
float targetAngle = Vector3.Angle(targetDirection, aimDirection);
if (targetAngle > angleLimit)
{
blendOut = (targetAngle - angleLimit) / 50;
}
Vector3 direction = Vector3.Slerp(targetDirection, aimDirection, blendOut);
return aimTransform.position direction;
}
void LateUpdate()
{
Vector3 targetPosition = GetTargetPosition();
//Debug.Log("GetTargetPosition: " GetTargetPosition());
for (int i = 0; i < iterations; i )
{
AimAtTarget(spine2, targetPosition);
}
}
void AimAtTarget(Transform bone, Vector3 targetPosition)
{
Vector3 aimDirection = aimTransform.forward;
Debug.Log(aimTransform.forward);
Vector3 targetDirection = targetPosition - aimTransform.position;
Quaternion aimTowards = Quaternion.FromToRotation(aimDirection, targetDirection);
//Debug.Log("aimTowards: " aimTowards);
bone.rotation = bone.rotation * aimTowards;
}
}
Ответ №1:
Хорошо, я исправил это, проблема заключалась в том, что, когда я поворачивал плеер влево, я устанавливал проигрыватель.вращение на кватернион.Эйлер. Если я вместо этого использую плеер.Поворот(0, 180, 0) все это работает.