- Home /
Moving player in direciton camera is facing
I have a 3rd person camera which can rotate around the player. My problem is that wherever camera is facing, players forward is always the same direction.
For example when camera is facing the right side of the player, when I press button to move forward, I want player to turn to the left and make that the "new forward".
I have Player object with Camera as child object. Camera object has Camera script. Inside Camera script there are Player and Camera classes. Player object itself, has Input Controller.
Also I'm making this script for joystick/ controller primarily.
My camera script so far:
using UnityEngine;
using System.Collections;
public class PlayerScript : MonoBehaviour
{
public float RotateSpeed = 10,
MoveSpeed = 10;
float DeltaTime;
void Update()
{
DeltaTime = Time.deltaTime;
transform.Rotate(0, Input.GetAxis("Right Horizontal") * RotateSpeed * DeltaTime, 0);
transform.Translate(0, 0, -Input.GetAxis("Right Vertical") * MoveSpeed * DeltaTime);
}
}
public class CameraScript : MonoBehaviour
{
public GameObject Target;
public float RotateSpeed = 10,
FollowDistance = 20,
FollowHeight = 10;
float RotateSpeedPerTime,
DesiredRotationAngle,
DesiredHeight,
CurrentRotationAngle,
CurrentHeight,
Yaw,
Pitch;
Quaternion CurrentRotation;
void LateUpdate()
{
RotateSpeedPerTime = RotateSpeed * Time.deltaTime;
DesiredRotationAngle = Target.transform.eulerAngles.y;
DesiredHeight = Target.transform.position.y + FollowHeight;
CurrentRotationAngle = transform.eulerAngles.y;
CurrentHeight = transform.position.y;
CurrentRotationAngle = Mathf.LerpAngle(CurrentRotationAngle, DesiredRotationAngle, 0);
CurrentHeight = Mathf.Lerp(CurrentHeight, DesiredHeight, 0);
CurrentRotation = Quaternion.Euler(0, CurrentRotationAngle, 0);
transform.position = Target.transform.position;
transform.position -= CurrentRotation * Vector3.forward * FollowDistance;
transform.position = new Vector3(transform.position.x, CurrentHeight, transform.position.z);
Yaw = Input.GetAxis("Right Horizontal") * RotateSpeedPerTime;
Pitch = Input.GetAxis("Right Vertical") * RotateSpeedPerTime;
transform.Translate(new Vector3(Yaw, -Pitch, 0));
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z);
transform.LookAt(Target.transform);
}
}
Answer by _MGB_ · Aug 23, 2014 at 03:13 PM
I just transform the movement vector into camera space like this:
var vec = Vector3.zero;
vec.x = Input.GetAxis("Horizontal");
vec.z = Input.GetAxis("Vertical");
vec = Camera.main.transform.TransformDirection(vec);
vec.y = 0;
vec *= Speed;
attach a caharacterController to your player and you can use
function Update()
{
var vec = Vector3.zero; vec.x = Input.GetAxis("Horizontal"); vec.z = Input.GetAxis("Vertical"); vec = Camera.main.transform.TransformDirection(vec); vec.y = 0; vec *= Speed;
simple$$anonymous$$ove(vec)
}
to move the player and get rid of this
transform.Translate(0, 0, -Input.GetAxis("Right Vertical") * $$anonymous$$oveSpeed * DeltaTime);
Isn't your code in javascript? Cause $$anonymous$$e is in c# Also, I got rid of that code as you said and now it "sometimes" changes direction of forward.
Now, how do I make it constant? Because when I look at the back of the player and press forward, player goes forward. Then I rotate 360 around the player and "forward direction" is tilted for 90 degrees. So every 360 turn there is 90 degrees of direction change.