- Home /
Simple Tank Controller
I'm trying to create a simple tank based game and basically I wan't to have a tank move forward with W, back with S, turn right with D and left with A in a simple world (the floor will always be the same height and the walls are quite simple) my problem is I've tried to implement it before and always had some problems with it not behaving exactly as it should. My question is what is the best practice way to do it: by using a Rigidbody and AddForce, or by using a Character Controller, or by just manually setting the positions and handling collisions myself?
Thanks, in advance :) - James
Hi James, as with many issues in Unity there are many ways to approach it. Part of the solution relies on the kind of terrain / environment the tank will be covering - whats your plan? This may alter whether you should use wheel colliders, primitive colliders, raycasting.. etc?
Answer by aldonaletto · May 27, 2011 at 12:59 PM
Believe me, the Character Controller is easier to use. Just add the prefab Standard Assets/Character Controllers/First Person Controller to your scene. It has built-in controls which allows left-right and forth-back movimentation, but doesn't turn. You can disable or delete the 3 built-in scripts and add this one:
private var controller: CharacterController;
var speed: float = 6.0;
var turnSpeed: float = 90;
function Start(){
controller = GetComponent(CharacterController);
}
function Update(){
var movDir: Vector3;
transform.Rotate(0,Input.GetAxis("Horizontal")*turnSpeed*Time.deltaTime,0);
movDir = transform.forward*Input.GetAxis("Vertical")*speed;
// moves the character in horizontal direction
controller.Move(movDir*Time.deltaTime-Vector3.up*0.1);
}
It's very simple, but does the job: it goes forth and back, turns to right and left, and DOESN'T jump, which would be very strange for a thank!
Thanks for this.
For anyone who may need it, here is the script in c#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TankMovement : MonoBehaviour
{
private CharacterController controller;
public float speed = 6f;
public float turnSpeed = 90f;
private void Start()
{
controller = GetComponent<CharacterController>();
}
private void Update()
{
Vector3 movDir;
transform.Rotate(0, Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime, 0);
movDir = transform.forward * Input.GetAxis("Vertical") * speed;
// moves the character in horizontal direction
controller.Move(movDir * Time.deltaTime - Vector3.up * 0.1f);
}
}
Answer by jgt79 · Jan 12 at 05:01 PM
I know you've already had your question answered, but thought I'd share this link. I found this very helpful.