#c# #unity3d #controller #camera
Вопрос:
Я не могу ограничить вращение по оси Y , а также я бы попросил своего игрока смотреть в том направлении, в котором он движется, я уже пытался поставить Mathf.calmp для сенсорного экрана.Touchdist.y (ось Y камеры), но это не работает, я не знаю, откуда взялась проблема, но я хотел бы ее решить, поэтому, пожалуйста, помогите мне. вот мой код :
public FloatingJoystick joystick;
public TouchField touchField;
public GameObject FocusPoint;
[HideInInspector] public CharacterController characterController;
[HideInInspector] public Vector3 motionVector , gravityVector, RelativeVector;
[Header("Player Settings")]
[Range(0,6)] public float PlayerSpeed = 2.5f;
[Range(0, 100)] public float Sensivility = 50;
[Range(0, 0.5f)] public float groundClearance;
private float gravityForce = -9.18f;
private float gravityPower = -9.8f;
private float JumpValue = 9.8f;
private float TurnDiraction;
private void Start()
{
characterController = GetComponent<CharacterController>();
}
private void Update()
{
Movment();
CameraController();
if (characterController.isGrounded)
{
print("Grounded");
}
}
public void CameraController()
{
RelativeVector = transform.InverseTransformPoint(FocusPoint.transform.position);
RelativeVector /= RelativeVector.magnitude;
TurnDiraction = (RelativeVector.x / RelativeVector.magnitude);
FocusPoint.transform.eulerAngles = new Vector3(FocusPoint.transform.eulerAngles.x touchField.TouchDist.y, FocusPoint.transform.eulerAngles.y, 0) ;
FocusPoint.transform.parent.Rotate(transform.up * touchField.TouchDist.x * Sensivility * Time.deltaTime);
}
public void Movment()
{
if (characterController.isGrounded amp;amp; gravityVector.y < 0)
{
gravityVector.y = -2;
}
gravityVector.y = gravityPower * Time.deltaTime;
characterController.Move(gravityVector * Time.deltaTime);
if (characterController.isGrounded)
{
motionVector = transform.right * joystick.Horizontal transform.forward * joystick.Vertical;
characterController.Move(motionVector * PlayerSpeed * Time.deltaTime);
if(joystick.Vertical > 0)
{
transform.Rotate(transform.up * TurnDiraction * 800 * Time.deltaTime);
FocusPoint.transform.parent.Rotate(transform.up * -TurnDiraction * 800 * Time.deltaTime);
}
}
}
Ответ №1:
Вы вращаетесь в 2 шага, а во втором и во втором вы делаете:
FocusPoint.transform.parent.Rotate(transform.up * touchField.TouchDist.x * Sensivility * Time.deltaTime);
Если вы поворачиваете родителя относительно оси y, все дочерние элементы поворачиваются вместе с поворотом, заданным родителю в иерархии. Поэтому не имеет значения, что вы зафиксировали поворот y на предыдущем шаге
FocusPoint.transform.eulerAngles = new Vector3(FocusPoint.transform.eulerAngles.x touchField.TouchDist.y, FocusPoint.transform.eulerAngles.y, 0);
если игровой объект будет повернут относительно оси y после.
Попробуйте вращаться сразу в соответствии с вашими ограничениями или примите во внимание эти ограничения для всех шагов вращения.
С другой стороны, гравитация-это не сила и не сила, а ускорение 🙂