Итак, я перемещаю камеру так, как ...
public static CameraController Instance{ set; get; }
public Transform lookAt;
public Transform camTransform;
private Camera cam;
public const float Y_ANGLE_MIN = 0.0f;
public const float Y_ANGLE_MAX = 50.0f;
public float distance = 10.0f;
public float currentX = 0.0f;
public float currentY = 0.0f;
public float sensitivityX = 7.0f;
public float sensitivityY = 7.0f;
private void Start(){
Instance = this;
camTransform = transform;
cam = Camera.main;
}
private void Update(){
currentX += InputManager.SecondaryHorizontal ();
currentY += InputManager.SecondaryVertical ();
currentY = Mathf.Clamp (currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
}
private void LateUpdate(){
Vector3 dir = new Vector3 (0, 0, -distance);
Quaternion rotation = Quaternion.Euler(currentY,currentX,0);
camTransform.position = lookAt.position + rotation * dir;
camTransform.LookAt (lookAt.position);
this.transform.position += Vector3.up;
}
Я вращаю плеер по мере того, как камера вращается так же
private void Update(){
this.transform.eulerAngles = CameraController.Instance.camTransform.eulerAngles;
}
Я ожидаю, что когда мой игрок поворачивается влево, нажмите MainVertical()
(прикреплен к элементам управления WASD и джойстику X, Y)
public static float MainVertical(){
float r = 0.0f;
r += Input.GetAxis ("J_MainVertical");
r += Input.GetAxis ("K_MainVertical");
return Mathf.Clamp (r, -1.0f, 1.0f);
}
будет вращаться, перемещая игрока вперед в направлении, которое теперь является forward
направлением
Однако персонаж продолжает двигаться вперед в направлении, которое изначально было forward
.
Я могу только предположить, что проблема в том, что передняя ось изменилась для объекта, x, y, z в мировом пространстве не изменится, и вот что MainVertical()
все еще обращается к
В соответствии с запросом здесь указан код для движения моего персонажа
private CharacterController controller;
private Animator anim;
//Speed settings
private float walkingSpeed = 5.0f;
private float runningSpeed = 7.5f;
//Jump and gravity settings
private float verticalVelocity;
private float gravity = 14.0f;
private float jumpForce = 10.0f;
private void Start(){
controller = GetComponent<CharacterController> ();
anim = GetComponent<Animator> ();
}
private void Update(){
this.transform.eulerAngles = CameraController.Instance.camTransform.eulerAngles;
Jump ();
Vector3 moveVector = InputManager.MainJoystick ();
moveVector.x = moveVector.x * walkingSpeed;
moveVector.y = verticalVelocity;
moveVector.z = moveVector.z * walkingSpeed;
controller.Move (moveVector * Time.deltaTime);
Vector3 camForward = Vector3.Scale (CameraController.Instance.camTransform.forward, new Vector3 (1, 0, 1)).normalized;
if (moveVector.x != 0 || moveVector.z != 0) {
anim.SetBool ("IsIdle", false);
anim.SetBool ("IsWalking", true);
} else {
anim.SetBool ("IsIdle", true);
anim.SetBool ("IsWalking", false);
}
}
protected void Jump(){
if (controller.isGrounded) {
verticalVelocity = -gravity * Time.deltaTime;
if (InputManager.AButton()) {
anim.SetTrigger ("Jump");
verticalVelocity = jumpForce;
}
} else {
verticalVelocity -= gravity * Time.deltaTime;
//anim.SetTrigger ("Landing");
}
}
}
А вот и мой менеджер ввода
// -- Axis
public static float MainHorizontal(){
float r = 0.0f;
r += Input.GetAxis ("J_MainHorizontal");
r += Input.GetAxis ("K_MainHorizontal");
return Mathf.Clamp (r, -1.0f, 1.0f);
}
public static float MainVertical(){
float r = 0.0f;
r += Input.GetAxis ("J_MainVertical");
r += Input.GetAxis ("K_MainVertical");
return Mathf.Clamp (r, -1.0f, 1.0f);
}
public static Vector3 MainJoystick(){
return new Vector3 (MainHorizontal (), 0, MainVertical ());
}
public static float SecondaryHorizontal(){
float r = 0.0f;
r += Input.GetAxis ("J_SecondaryHorizontal");
r += Input.GetAxis ("Mouse X");
return Mathf.Clamp (r, -1.0f, 1.0f);
}
public static float SecondaryVertical(){
float r = 0.0f;
r += Input.GetAxis ("J_SecondaryVertical");
r += Input.GetAxis ("Mouse Y");
return Mathf.Clamp (r, -1.0f, 1.0f);
}
public static Vector3 SecondaryJoystick(){
return new Vector3 (SecondaryHorizontal (), SecondaryVertical (), 0);
}
// -- Buttons
public static bool AButton(){
return Input.GetButtonDown ("A_Button");
}
public static bool BButton(){
return Input.GetButtonDown ("B_Button");
}
public static bool XButton(){
return Input.GetButtonDown ("X_Button");
}
public static bool YButton(){
return Input.GetButtonDown ("Y_Button");
}