ShipControls

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
(Unity 1.2 doesn't show protected member variables in the inspector. Boo's memeber variables are protected by default)
m (Text replace - "</boo>" to "</syntaxhighlight>")
 
(13 intermediate revisions by 5 users not shown)
Line 12: Line 12:
  
 
== C# - ShipControls.cs ==
 
== C# - ShipControls.cs ==
<csharp>
+
<syntaxhighlight lang="csharp">
 +
 
 +
// Removed two depreciated functions.  Used Deg2Rad and back again because I don't know what I'm doing.  Anyone is welcome to clean this up properly.  -WarpZone
 +
 
 
using UnityEngine;
 
using UnityEngine;
 
using System.Collections;
 
using System.Collections;
Line 20: Line 23:
 
// that you can tweak to your heart's content.
 
// that you can tweak to your heart's content.
  
 
+
[RequireComponent (typeof (Rigidbody))]
 
public class ShipControls : MonoBehaviour
 
public class ShipControls : MonoBehaviour
 
{
 
{
Line 48: Line 51:
 
     public float slowADrag = 0.1F;
 
     public float slowADrag = 0.1F;
 
      
 
      
     public bool playerControl = false;
+
     public bool playerControl = true;
 
      
 
      
 
     float bank = 0F;
 
     float bank = 0F;
Line 90: Line 93:
 
         bank = Mathf.Lerp(bank, amountToBank, bankSpeed);
 
         bank = Mathf.Lerp(bank, amountToBank, bankSpeed);
 
          
 
          
         Vector3 rotation = transform.rotation.ToEulerAngles();
+
         Vector3 rotation = transform.rotation.eulerAngles;
 +
        rotation *= Mathf.Deg2Rad;
 
         rotation.x = 0F;
 
         rotation.x = 0F;
 
         rotation.z = 0F;
 
         rotation.z = 0F;
 
         rotation += bankAxis * bank;
 
         rotation += bankAxis * bank;
         transform.rotation = Quaternion.EulerAngles(rotation);
+
         //transform.rotation = Quaternion.EulerAngles(rotation);
 +
        rotation *= Mathf.Rad2Deg;
 +
        transform.rotation = Quaternion.Euler(rotation);
 
     }
 
     }
 
      
 
      
Line 118: Line 124:
 
         if (playerControl)
 
         if (playerControl)
 
         {
 
         {
             thrust = Input.GetAxis("Thrust");
+
             thrust = Input.GetAxis("Vertical");
             turn = Input.GetAxis("Turn") * turnSpeed;
+
             turn = Input.GetAxis("Horizontal") * turnSpeed;
 
         }
 
         }
 
                  
 
                  
Line 145: Line 151:
 
     }
 
     }
 
}
 
}
</csharp>
+
</syntaxhighlight>
  
 
== Boo - ShipControls.boo ==
 
== Boo - ShipControls.boo ==
 
This is a direct, verbatim conversion from the C# version. No attempt has been made to use Boo features.
 
This is a direct, verbatim conversion from the C# version. No attempt has been made to use Boo features.
<boo>
+
<syntaxhighlight lang="boo">
 
import UnityEngine
 
import UnityEngine
 
import System.Collections
 
import System.Collections
  
 +
[RequireComponent (Rigidbody)]
 
class ShipControls (MonoBehaviour):
 
class ShipControls (MonoBehaviour):
 
     public hoverHeight = 3F
 
     public hoverHeight = 3F
Line 179: Line 186:
 
     public slowADrag = 0.1F
 
     public slowADrag = 0.1F
  
     public playerControl = false
+
     public playerControl = true
 
      
 
      
 
     public bank = 0F
 
     public bank = 0F
Line 233: Line 240:
  
 
         if (playerControl):
 
         if (playerControl):
             thrust = Input.GetAxis("Thrust")
+
             thrust = Input.GetAxis("Vertical")
             turn = Input.GetAxis("Turn") * turnSpeed
+
             turn = Input.GetAxis("Horizontal") * turnSpeed
  
 
         if (thrust > 0.0):
 
         if (thrust > 0.0):
Line 249: Line 256:
 
         rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime)
 
         rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime)
 
         rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime)
 
         rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime)
</boo>
+
</syntaxhighlight>
 +
 
 +
== JavaScript - ShipControls.js ==
 +
And here's a JavaScript version.  Just because.
 +
<syntaxhighlight lang="javascript">
 +
// js adaptation by WarpZone
 +
 
 +
// Put this on a rigidbody object and instantly
 +
// have 2D spaceship controls like OverWhelmed Arena
 +
// that you can tweak to your heart's content.
 +
 
 +
@script RequireComponent (Rigidbody)
 +
 
 +
  var hoverHeight : float = 3;
 +
    var hoverHeightStrictness : float = 1.0;
 +
    var  forwardThrust : float = 5000.0;
 +
    var  backwardThrust : float = 2500.0;
 +
    var  bankAmount : float = 0.1;
 +
    var  bankSpeed : float = 0.2;
 +
    var  bankAxis : Vector3 = new Vector3(-1.0, 0.0, 0.0);
 +
    var  turnSpeed : float = 8000.0;
 +
   
 +
    var  forwardDirection : Vector3 = new Vector3(0.0, 0.0, 1.0);
 +
 
 +
    var  mass : float = 5.0;
 +
   
 +
    // positional drag
 +
    var sqrdSpeedThresholdForDrag : float = 25.0;
 +
    var superDrag : float = 2.0;
 +
    var fastDrag : float = 0.5;
 +
    var slowDrag : float = 0.01;
 +
   
 +
    // angular drag
 +
    var sqrdAngularSpeedThresholdForDrag : float = 5.0;
 +
    var superADrag : float = 32.0;
 +
    var fastADrag : float = 16.0;
 +
    var slowADrag : float = 0.1;
 +
   
 +
 
 +
   
 +
    var playerControl : boolean = true;
 +
   
 +
    private var bank : float = 0.0;
 +
 
 +
function SetPlayerControl(control : boolean)
 +
    {
 +
        playerControl = control;
 +
    }
 +
 
 +
 
 +
    function Start()
 +
    {
 +
        gameObject.rigidbody.mass = mass;
 +
    }
 +
   
 +
    function FixedUpdate()
 +
    {
 +
        if (Mathf.Abs(thrust) > 0.01)
 +
        {
 +
            if (rigidbody.velocity.sqrMagnitude > sqrdSpeedThresholdForDrag)
 +
                rigidbody.drag = fastDrag;
 +
            else
 +
                rigidbody.drag = slowDrag;
 +
        }
 +
        else
 +
            rigidbody.drag = superDrag;
 +
                   
 +
        if (Mathf.Abs(turn) > 0.01)
 +
        {
 +
            if (rigidbody.angularVelocity.sqrMagnitude > sqrdAngularSpeedThresholdForDrag)
 +
                rigidbody.angularDrag = fastADrag;
 +
            else
 +
                rigidbody.angularDrag = slowADrag;
 +
        }
 +
        else
 +
            rigidbody.angularDrag = superADrag;
 +
       
 +
        transform.position = Vector3.Lerp(transform.position, new Vector3(transform.position.x, hoverHeight, transform.position.z), hoverHeightStrictness);
 +
       
 +
        var amountToBank : float = rigidbody.angularVelocity.y * bankAmount;
 +
 
 +
        bank = Mathf.Lerp(bank, amountToBank, bankSpeed);
 +
       
 +
        var rotation : Vector3 = transform.rotation.eulerAngles;
 +
        rotation *= Mathf.Deg2Rad;
 +
        rotation.x = 0;
 +
        rotation.z = 0;
 +
        rotation += bankAxis * bank;
 +
        rotation *= Mathf.Rad2Deg;
 +
        transform.rotation = Quaternion.Euler(rotation);
 +
    }
 +
   
 +
    // thrust
 +
    private var thrust : float = 0;
 +
    private var turn : float = 0;
 +
   
 +
function Thrust( t : float )
 +
    {
 +
        thrust = Mathf.Clamp( t, -1.0, 1.0 );
 +
    }
 +
   
 +
    function Turn(t : float)
 +
    {
 +
        turn = Mathf.Clamp( t, -1.0, 1.0 ) * turnSpeed;
 +
    }
 +
   
 +
    private var thrustGlowOn : boolean = false;
 +
   
 +
    function Update ()
 +
    {
 +
        var theThrust : float = thrust;
 +
       
 +
        if (playerControl)
 +
        {
 +
            thrust = Input.GetAxis("Vertical");
 +
            turn = Input.GetAxis("Horizontal") * turnSpeed;
 +
        }
 +
               
 +
        if (thrust > 0.0)
 +
        {
 +
            theThrust *= forwardThrust;
 +
            if (!thrustGlowOn)
 +
            {
 +
                thrustGlowOn = !thrustGlowOn;
 +
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
 +
            }
 +
        }
 +
        else
 +
        {
 +
            theThrust *= backwardThrust;
 +
            if (thrustGlowOn)
 +
            {
 +
                thrustGlowOn = !thrustGlowOn;
 +
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
 +
            }
 +
        }
 +
       
 +
        rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime);
 +
        rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime);
 +
}
 +
</javascript >

Latest revision as of 20:57, 10 January 2012

Author: Jonathan Czeck (aarku)

Contents

[edit] Description

This script performs 2D spaceship controls like OverWhelmed Arena that you can tweak to your heart's content. The input to the script, player or bot, is abstracted. This means you can have a Bot script in conjunction with this one that will drive the ship.

[edit] Usage

Place this script on a GameObject with a RigidBody component on it.

[edit] C# - ShipControls.cs

// Removed two depreciated functions.  Used Deg2Rad and back again because I don't know what I'm doing.  Anyone is welcome to clean this up properly.  -WarpZone
 
using UnityEngine;
using System.Collections;
 
// Put this on a rigidbody object and instantly
// have 2D spaceship controls like OverWhelmed Arena
// that you can tweak to your heart's content.
 
[RequireComponent (typeof (Rigidbody))]
public class ShipControls : MonoBehaviour
{
    public float hoverHeight = 3F;
    public float hoverHeightStrictness = 1F;
    public float forwardThrust = 5000F;
    public float backwardThrust = 2500F;
    public float bankAmount = 0.1F;
    public float bankSpeed = 0.2F;
    public Vector3 bankAxis = new Vector3(-1F, 0F, 0F);
    public float turnSpeed = 8000F;
 
    public Vector3 forwardDirection = new Vector3(1F, 0F, 0F);
 
    public float mass = 5F;
 
    // positional drag
    public float sqrdSpeedThresholdForDrag = 25F;
    public float superDrag = 2F;
    public float fastDrag = 0.5F;
    public float slowDrag = 0.01F;
 
    // angular drag
    public float sqrdAngularSpeedThresholdForDrag = 5F;
    public float superADrag = 32F;
    public float fastADrag = 16F;
    public float slowADrag = 0.1F;
 
    public bool playerControl = true;
 
    float bank = 0F;
 
    void SetPlayerControl(bool control)
    {
        playerControl = control;
    }
 
    void Start()
    {
        rigidbody.mass = mass;
    }
 
    void FixedUpdate()
    {
        if (Mathf.Abs(thrust) > 0.01F)
        {
            if (rigidbody.velocity.sqrMagnitude > sqrdSpeedThresholdForDrag)
                rigidbody.drag = fastDrag;
            else
                rigidbody.drag = slowDrag;
        }
        else
            rigidbody.drag = superDrag;
 
        if (Mathf.Abs(turn) > 0.01F)
        {
            if (rigidbody.angularVelocity.sqrMagnitude > sqrdAngularSpeedThresholdForDrag)
                rigidbody.angularDrag = fastADrag;
            else
                rigidbody.angularDrag = slowADrag;
        }
        else
            rigidbody.angularDrag = superADrag;
 
        transform.position = Vector3.Lerp(transform.position, new Vector3(transform.position.x, hoverHeight, transform.position.z), hoverHeightStrictness);
 
        float amountToBank = rigidbody.angularVelocity.y * bankAmount;
 
        bank = Mathf.Lerp(bank, amountToBank, bankSpeed);
 
        Vector3 rotation = transform.rotation.eulerAngles;
        rotation *= Mathf.Deg2Rad;
        rotation.x = 0F;
        rotation.z = 0F;
        rotation += bankAxis * bank;
        //transform.rotation = Quaternion.EulerAngles(rotation);
         rotation *= Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(rotation);
    }
 
    float thrust = 0F;
    float turn = 0F;
 
    void Thrust(float t)
    {
        thrust = Mathf.Clamp(t, -1F, 1F);
    }
 
    void Turn(float t)
    {
        turn = Mathf.Clamp(t, -1F, 1F) * turnSpeed;
    }
 
    bool thrustGlowOn = false;
 
    void Update ()
    {
        float theThrust = thrust;
 
        if (playerControl)
        {
            thrust = Input.GetAxis("Vertical");
            turn = Input.GetAxis("Horizontal") * turnSpeed;
        }
 
        if (thrust > 0F)
        {
            theThrust *= forwardThrust;
            if (!thrustGlowOn)
            {
                thrustGlowOn = !thrustGlowOn;
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
            }
        }
        else
        {
            theThrust *= backwardThrust;
            if (thrustGlowOn)
            {
                thrustGlowOn = !thrustGlowOn;
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
            }
        }
 
        rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime);
        rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime);
    }
}

[edit] Boo - ShipControls.boo

This is a direct, verbatim conversion from the C# version. No attempt has been made to use Boo features.

import UnityEngine
import System.Collections
 
[RequireComponent (Rigidbody)]
class ShipControls (MonoBehaviour):
    public hoverHeight = 3F
    public hoverHeightStrictness = 1F
    public forwardThrust = 5000F
    public backwardThrust = 2500F
    public bankAmount = 0.1F
    public bankSpeed = 0.2F
    public bankAxis = Vector3(-1F, 0F, 0F)
    public turnSpeed = 8000F
 
    public forwardDirection = Vector3(1F, 0F, 0F)
 
    public mass = 5F
 
    // positional drag
    public sqrdSpeedThresholdForDrag = 25F
    public superDrag = 2F
    public fastDrag = 0.5F
    public slowDrag = 0.01F
 
    // angular drag
    public sqrdAngularSpeedThresholdForDrag = 5F
    public superADrag = 32F
    public fastADrag = 16F
    public slowADrag = 0.1F
 
    public playerControl = true
 
    public bank = 0F
 
    def SetPlayerControl(control as bool):
        playerControl = control
 
    def Start():
        rigidbody.mass = mass
 
    def FixedUpdate():
        if Mathf.Abs(thrust) > 0.01:
            if rigidbody.velocity.sqrMagnitude > sqrdSpeedThresholdForDrag:
                rigidbody.drag = fastDrag
            else:
                rigidbody.drag = slowDrag
        else:
            rigidbody.drag = superDrag
 
        if Mathf.Abs(turn) > 0.01:
            if rigidbody.angularVelocity.sqrMagnitude > sqrdAngularSpeedThresholdForDrag:
                rigidbody.angularDrag = fastADrag
            else:
                rigidbody.angularDrag = slowADrag
        else:
            rigidbody.angularDrag = superADrag
 
        transform.position = Vector3.Lerp(transform.position, Vector3(transform.position.x, hoverHeight, transform.position.z), hoverHeightStrictness)
 
        amountToBank as single = rigidbody.angularVelocity.y * bankAmount
 
        bank = Mathf.Lerp(bank, amountToBank, bankSpeed)
 
        rotation = transform.rotation.ToEulerAngles()
        rotation.x = 0F
        rotation.z = 0F
        rotation += bankAxis * bank
        transform.rotation = Quaternion.EulerAngles(rotation)
 
    thrust = 0F
    turn = 0F
 
    def Thrust(t as single):
        turn = Mathf.Clamp(t, -1F, 1F) * turnSpeed
 
    def Turn(t as single):
        turn = Mathf.Clamp(t, -1F, 1F) * turnSpeed
 
    thrustGlowOn = false
 
    def Update ():
        theThrust = thrust
 
        if (playerControl):
            thrust = Input.GetAxis("Vertical")
            turn = Input.GetAxis("Horizontal") * turnSpeed
 
        if (thrust > 0.0):
            theThrust *= forwardThrust
            if (not thrustGlowOn):
                thrustGlowOn = not thrustGlowOn
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver)
        else:
            theThrust *= backwardThrust
            if (thrustGlowOn):
                thrustGlowOn = not thrustGlowOn
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver)
 
        rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime)
        rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime)

[edit] JavaScript - ShipControls.js

And here's a JavaScript version. Just because.

// js adaptation by WarpZone
 
// Put this on a rigidbody object and instantly
// have 2D spaceship controls like OverWhelmed Arena
// that you can tweak to your heart's content.
 
@script RequireComponent (Rigidbody)
 
   	var hoverHeight : float = 3;
    var hoverHeightStrictness : float = 1.0;
    var  forwardThrust : float = 5000.0;
    var  backwardThrust : float = 2500.0;
    var  bankAmount : float = 0.1;
    var  bankSpeed : float = 0.2;
    var  bankAxis : Vector3 = new Vector3(-1.0, 0.0, 0.0);
    var  turnSpeed : float = 8000.0;
 
    var  forwardDirection : Vector3 = new Vector3(0.0, 0.0, 1.0);
 
    var  mass : float = 5.0;
 
    // positional drag
    var sqrdSpeedThresholdForDrag : float = 25.0;
    var superDrag : float = 2.0;
    var fastDrag : float = 0.5;
    var slowDrag : float = 0.01;
 
    // angular drag
    var sqrdAngularSpeedThresholdForDrag : float = 5.0;
    var superADrag : float = 32.0;
    var fastADrag : float = 16.0;
    var slowADrag : float = 0.1;
 
 
 
    var playerControl : boolean = true;
 
    private var bank : float = 0.0;
 
	function SetPlayerControl(control : boolean)
    {
        playerControl = control;
    }
 
 
    function Start()
    {
        gameObject.rigidbody.mass = mass;
    }
 
    function FixedUpdate()
    {
        if (Mathf.Abs(thrust) > 0.01)
        {
            if (rigidbody.velocity.sqrMagnitude > sqrdSpeedThresholdForDrag)
                rigidbody.drag = fastDrag;
            else
                rigidbody.drag = slowDrag;
        }
        else
            rigidbody.drag = superDrag;
 
        if (Mathf.Abs(turn) > 0.01)
        {
            if (rigidbody.angularVelocity.sqrMagnitude > sqrdAngularSpeedThresholdForDrag)
                rigidbody.angularDrag = fastADrag;
            else
                rigidbody.angularDrag = slowADrag;
        }
        else
            rigidbody.angularDrag = superADrag;
 
        transform.position = Vector3.Lerp(transform.position, new Vector3(transform.position.x, hoverHeight, transform.position.z), hoverHeightStrictness);
 
        var amountToBank : float = rigidbody.angularVelocity.y * bankAmount;
 
        bank = Mathf.Lerp(bank, amountToBank, bankSpeed);
 
        var rotation : Vector3 = transform.rotation.eulerAngles;
        rotation *= Mathf.Deg2Rad;
        rotation.x = 0;
        rotation.z = 0;
        rotation += bankAxis * bank;
        rotation *= Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(rotation);
    }
 
    // thrust
    private var thrust : float = 0;
    private var turn : float = 0;
 
 	function Thrust( t : float )
    {
        thrust = Mathf.Clamp( t, -1.0, 1.0 );
    }
 
    function Turn(t : float)
    {
        turn = Mathf.Clamp( t, -1.0, 1.0 ) * turnSpeed;
    }
 
    private var thrustGlowOn : boolean = false;
 
    function Update ()
    {
        var theThrust : float = thrust;
 
        if (playerControl)
        {
            thrust = Input.GetAxis("Vertical");
            turn = Input.GetAxis("Horizontal") * turnSpeed;
        }
 
        if (thrust > 0.0)
        {
            theThrust *= forwardThrust;
            if (!thrustGlowOn)
            {
                thrustGlowOn = !thrustGlowOn;
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
            }
        }
        else
        {
            theThrust *= backwardThrust;
            if (thrustGlowOn)
            {
                thrustGlowOn = !thrustGlowOn;
                BroadcastMessage("SetThrustGlow", thrustGlowOn, SendMessageOptions.DontRequireReceiver);
            }
        }
 
        rigidbody.AddRelativeTorque(Vector3.up * turn * Time.deltaTime);
        rigidbody.AddRelativeForce(forwardDirection * theThrust * Time.deltaTime);
}
</javascript >
Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox