ShipControls

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
(C# - ShipControls.cs)
(C# - ShipControls.cs)
Line 13: Line 13:
 
== C# - ShipControls.cs ==
 
== C# - ShipControls.cs ==
 
<csharp>
 
<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;

Revision as of 15:01, 14 March 2009

Author: Jonathan Czeck (aarku)

Contents

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.

Usage

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

C# - ShipControls.cs

<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 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);
   }

} </csharp>

Boo - ShipControls.boo

This is a direct, verbatim conversion from the C# version. No attempt has been made to use Boo features. <boo> 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)

</boo>

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox