unity control problem
I built an first person shooter with the problem, that the controls just change the position of my game object on the normal xyz-axis.
That is very confusing for the player. How is it possible to change the position of the game object with the same input-keys but with the camera xyz-axis?
My code so far:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class PlayerBehaviour : MonoBehaviour
{
[System.Serializable]
public class MoveSettings
{
public float runVelocity = 12;
public float rotateVelocity = 100;
public float jumpVelocity = 8;
public float distanceToGround = 1.3f;
public LayerMask ground;
}
[System.Serializable]
public class InputSettings
{
public string FORWARD_AXIS = "Vertical";
public string SIDEWAYS_AXIS = "Horizontal";
public string TURN_AXIS = "Mouse X";
public string JUMP_AXIS = "Jump";
}
public MoveSettings moveSettings;
public InputSettings inputSettings;
public Transform spawnPoint;
private Rigidbody playerRigidbody;
private Vector3 velocity;
private Quaternion targetRotation;
private float forwardInput, sidewaysInput, turnInput, jumpInput;
bool Grounded()
{
return Physics.Raycast(transform.position, Vector3.down, moveSettings.distanceToGround, moveSettings.ground);
}
void Awake()
{
velocity = Vector3.zero;
forwardInput = sidewaysInput = turnInput = jumpInput = 0;
targetRotation = transform.rotation;
playerRigidbody = gameObject.GetComponent<Rigidbody>();
}
void Start()
{
GameData.Instance.Lives = 3;
Spawn();
}
void Update()
{
GetInput();
Turn();
}
void FixedUpdate()
{
Run();
Jump();
}
void GetInput()
{
if (inputSettings.FORWARD_AXIS.Length != 0) forwardInput = Input.GetAxis(inputSettings.FORWARD_AXIS);
if (inputSettings.SIDEWAYS_AXIS.Length != 0) sidewaysInput = Input.GetAxis(inputSettings.SIDEWAYS_AXIS);
if (inputSettings.TURN_AXIS.Length != 0) turnInput = Input.GetAxis(inputSettings.TURN_AXIS);
if (inputSettings.JUMP_AXIS.Length != 0) jumpInput = Input.GetAxis(inputSettings.JUMP_AXIS);
}
void Run()
{
velocity.z = forwardInput * moveSettings.runVelocity;
velocity.x = sidewaysInput * moveSettings.runVelocity;
velocity.y = playerRigidbody.velocity.y;
playerRigidbody.velocity = transform.TransformDirection(velocity);
}
void Turn()
{
if (Mathf.Abs(turnInput) > 0)
{
targetRotation *= Quaternion.AngleAxis(moveSettings.rotateVelocity * turnInput * Time.deltaTime, Vector3.up);
}
transform.rotation = targetRotation;
}
void Jump()
{
if (jumpInput != 0 && Grounded())
{
playerRigidbody.velocity = new Vector3(playerRigidbody.velocity.x, moveSettings.jumpVelocity, velocity.z);
}
}
public void Spawn()
{
transform.position = spawnPoint.position;
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "DeathZone")
{
OnDeath();
}
}
void OnCollisionEnter(Collision other)
{
if (other.gameObject.tag == "Enemy")
{
Enemy enemy = other.gameObject.GetComponent<Enemy>();
Collider col = other.gameObject.GetComponent<Collider>();
Collider mycol = this.gameObject.GetComponent<Collider>();
if (enemy.invincible)
{
OnDeath();
}
else if (mycol.bounds.center.y - mycol.bounds.extents.y > col.bounds.center.y + 0.5f * col.bounds.extents.y)
{
GameData.Instance.Score += 10;
JumpedOnEnemy(enemy.bumpSpeed);
enemy.OnDeath();
}
else
{
OnDeath();
}
}
}
void JumpedOnEnemy(float bumpSpeed)
{
playerRigidbody.velocity = new Vector3(playerRigidbody.velocity.x, bumpSpeed, playerRigidbody.velocity.z);
}
void OnDeath()
{
GameData.Instance.Lives--;
Spawn();
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612105858im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Changing game controls for android 0 Answers
Controls won't work in executable file 0 Answers
touch control for two keyboard buttons 1 Answer
Make a "Progress Bar" during a recursive method in C# 1 Answer