- Home /
How do I make character's WASD controls move relative to my orbital camera axis?
Character:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class testscript : MonoBehaviour {
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;
private CharacterController controller;
private void Awake()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded)
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
Quaternion rotation = Quaternion.LookRotation(moveDirection, Vector3.up);
if (moveDirection != Vector3.zero)
transform.rotation = rotation;
moveDirection *= speed;
if (Input.GetButton("Jump"))
{
moveDirection.y = jumpSpeed;
}
Debug.DrawLine(transform.position, moveDirection);
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
Camera:
[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")] public class MouseOrbitImproved : MonoBehaviour {
public Transform target;
public float distance = 5.0f;
public float xSpeed = 120.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -20f;
public float yMaxLimit = 80f;
public float distanceMin = .5f;
public float distanceMax = 15f;
private Rigidbody rigidbody;
float x = 0.0f;
float y = 0.0f;
// Use this for initialization
void Start ()
{
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
rigidbody = GetComponent<Rigidbody>();
// Make the rigid body not change rotation
if (rigidbody != null)
{
rigidbody.freezeRotation = true;
}
}
void LateUpdate ()
{
if (target)
{
x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
y = ClampAngle(y, yMinLimit, yMaxLimit);
Quaternion rotation = Quaternion.Euler(y, x, 0);
distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);
RaycastHit hit;
if (Physics.Linecast (target.position, transform.position, out hit))
{
distance -= hit.distance;
}
Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
Vector3 position = rotation * negDistance + target.position;
transform.rotation = rotation;
transform.position = position;
}
}
public static float ClampAngle(float angle, float min, float max)
{
if (angle < -360F)
angle += 360F;
if (angle > 360F)
angle -= 360F;
return Mathf.Clamp(angle, min, max);
}
}
Answer by MarksGames · Apr 20, 2018 at 08:28 PM
Just parent the character to the camera.
The camera is a child of the character, but my character uses WASD to move and my camera is orbital. I'm just having a hard time figuring out how to make the WASD move based on the position of the camera
Answer by Arkade · Apr 20, 2018 at 09:09 PM
You likely want to do cross product of camera-player vector with the up vector. That'll give you a vector that is orthogonal to both = sideways. You multiply the horizontal axis input ('a'/'d') by that (and speed etc) to give you sideways movement. You multiply that sideways value by global/surface up vector to give you forwards/backwards (aligned to surface of you used surface up vector). Multiply that by vertical input ('w'/'s') (and speed etc) and you've got full camera-relative movement.
I'm on mobile in another country atm so won't try to post code (and must also apologise if I've misread your question). Hopefully my comment is enough to get you ... moving ;-) LMK if you'd like a bit more and I'll try to pay am excerpt after I've gotten home, Sunday.
Your answer
![](https://koobas.hobune.stream/wayback/20220612161212im_/https://answers.unity.com/themes/thub/images/avi.jpg)