Make sphere move for Android devices.

I changed my code from early and I made it simple. However, I cannot get my sphere to move when I press the joystick. Any suggestions?

var isDead:boolean = false;
var JoystickScript:Joystick;
var JoystickPos:Vector3;
var speed  : float;
function Update () {
    if (!isDead) {
        //Debug.Log(JoystickScript.position);
        JoystickPos = JoystickScript.position;
   
        if (JoystickPos.z > 0.4) {
            rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
            Debug.Log("Hit Joystick");
        } else if (JoystickPos.z < -0.4) {
            rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
           
        } else if (JoystickPos.x > 0.4) {
                rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
        } else if (JoystickPos.x < -0.4) {
                rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
        } else {
           
        }
    }
}

What is the speed variable set to?

Also, this is a more compact version of your script that might help:

var isDead : boolean = false;
var JoystickScript : Joystick;
var JoystickPos : Vector3;
var speed : float;

function Update () {
    if (!isDead) {
        JoystickPos = JoystickScript.position;
 
        if (Mathf.Abs(JoystickPos.x) > 0.4 || Mathf.Abs(JoystickPos.z) > 0.4) {
            rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
            Debug.Log("Hit Joystick");
        }
      
    }
}
1 Like

Can you post one sample output for Debug.Log(JoystickPos); ?

The JoystickPos is the Joystick script that attached to make it a variable.

//////////////////////////////////////////////////////////////
// Joystick.js
// Penelope iPhone Tutorial
//
// Joystick creates a movable joystick (via GUITexture) that
// handles touch input, taps, and phases. Dead zones can control
// where the joystick input gets picked up and can be normalized.
//
// Optionally, you can enable the touchPad property from the editor
// to treat this Joystick as a TouchPad. A TouchPad allows the finger
// to touch down at any point and it tracks the movement relatively
// without moving the graphic
//////////////////////////////////////////////////////////////

#pragma strict

@script RequireComponent( GUITexture )

// A simple class for bounding how far the GUITexture will move
class Boundary
{
    var min : Vector2 = Vector2.zero;
    var max : Vector2 = Vector2.zero;
}

static private var joysticks : Joystick[];                    // A static collection of all joysticks
static private var enumeratedJoysticks : boolean = false;
static private var tapTimeDelta : float = 0.3;                // Time allowed between taps

var touchPad : boolean;                                     // Is this a TouchPad?
var touchZone : Rect;
var deadZone : Vector3 = Vector3.zero;                        // Control when position is output
var normalize : boolean = false;                             // Normalize output after the dead-zone?
var position : Vector3;                                     // [-1, 1] in x,y
var tapCount : int;                                            // Current tap count

private var lastFingerId = -1;                                // Finger last used for this joystick
private var tapTimeWindow : float;                            // How much time there is left for a tap to occur
private var fingerDownPos : Vector2;
private var fingerDownTime : float;
private var firstDeltaTime : float = 0.5;

private var gui : GUITexture;                                // Joystick graphic
private var defaultRect : Rect;                                // Default position / extents of the joystick graphic
private var guiBoundary : Boundary = Boundary();            // Boundary for joystick graphic
private var guiTouchOffset : Vector2;                        // Offset to apply to touch input
private var guiCenter : Vector2;                            // Center of joystick


private var alphaOff:float = 0.0;

function Start()
{
    // Cache this component at startup instead of looking up every frame   
    gui = GetComponent( GUITexture );
   
    // Store the default rect for the gui, so we can snap back to it
    defaultRect = gui.pixelInset;
   
    gui.color.a = alphaOff;
   
    defaultRect.x += transform.position.x * Screen.width; // + gui.pixelInset.x; // -  Screen.width * 0.5;
    defaultRect.y += transform.position.y * Screen.height; //+ gui.pixelInset.y; // - Screen.height * 0.5;
   
    transform.position.x = 0.0;
    transform.position.y = 0.0;
       
    if ( touchPad )
    {
        // If a texture has been assigned, then use the rect ferom the gui as our touchZone
        if ( gui.texture )
            touchZone = defaultRect;
    }
    else
    {
        // This is an offset for touch input to match with the top left
        // corner of the GUI
        guiTouchOffset.x = defaultRect.width * 0.5;
        guiTouchOffset.y = defaultRect.height * 0.5;
       
        // Cache the center of the GUI, since it doesn't change
        guiCenter.x = defaultRect.x + guiTouchOffset.x;
        guiCenter.y = defaultRect.y + guiTouchOffset.y;
       
        // Let's build the GUI boundary, so we can clamp joystick movement
        guiBoundary.min.x = defaultRect.x - guiTouchOffset.x;
        guiBoundary.max.x = defaultRect.x + guiTouchOffset.x;
        guiBoundary.min.y = defaultRect.y - guiTouchOffset.y;
        guiBoundary.max.y = defaultRect.y + guiTouchOffset.y;
    }
   
}
   
   
function Disable()
{
    gameObject.active = false;
    enumeratedJoysticks = false;
}


function ResetJoystick()
{
    // Release the finger control and set the joystick back to the default position
    gui.pixelInset = defaultRect;
    lastFingerId = -1;
    position = Vector3.zero;
    fingerDownPos = Vector2.zero;
    gui.color.a = alphaOff;   
}

function IsFingerDown() : boolean
{
    return (lastFingerId != -1);
}
   
function LatchedFinger( fingerId : int )
{
    // If another joystick has latched this finger, then we must release it
    if ( lastFingerId == fingerId )
        ResetJoystick();
}

function Update()
{   
        if ( !enumeratedJoysticks )
        {
            // Collect all joysticks in the game, so we can relay finger latching messages
            joysticks = FindObjectsOfType(Joystick) as Joystick[];
            enumeratedJoysticks = true;
        }   
           
        var count = Input.touchCount;
       
        // Adjust the tap time window while it still available
        if ( tapTimeWindow > 0 )
            tapTimeWindow -= Time.deltaTime;
        else
            tapCount = 0;
       
        if ( count == 0 )
            ResetJoystick();
        else
        {
            for(var i : int = 0;i < count; i++)
            {
                var touch : Touch = Input.GetTouch(i);           
                var guiTouchPos : Vector2 = touch.position - guiTouchOffset;
       
                var shouldLatchFinger = false;
                if ( touchPad )
                {               
                    if ( touchZone.Contains( touch.position ) )
                        shouldLatchFinger = true;
                }
                else if ( gui.HitTest( touch.position ) )
                {
                    shouldLatchFinger = true;
                    gui.color.a = .5;
                }       
       
                // Latch the finger if this is a new touch
                if ( shouldLatchFinger && ( lastFingerId == -1 || lastFingerId != touch.fingerId ) )
                {
                   
                    if ( touchPad )
                    {
                       
                        //gui.color.a = 0.15;
                       
                        lastFingerId = touch.fingerId;
                        fingerDownPos = touch.position;
                        fingerDownTime = Time.time;
                    }
                   
                    lastFingerId = touch.fingerId;
                   
                    // Accumulate taps if it is within the time window
                    if ( tapTimeWindow > 0 )
                        tapCount++;
                    else
                    {
                        tapCount = 1;
                        tapTimeWindow = tapTimeDelta;
                    }
                                               
                    // Tell other joysticks we've latched this finger
                    for ( var j : Joystick in joysticks )
                    {
                        if ( j != this )
                            j.LatchedFinger( touch.fingerId );
                    }                       
                }               
       
                if ( lastFingerId == touch.fingerId )
                {   
                    // Override the tap count with what the iPhone SDK reports if it is greater
                    // This is a workaround, since the iPhone SDK does not currently track taps
                    // for multiple touches
                    if ( touch.tapCount > tapCount )
                        tapCount = touch.tapCount;
                   
                    if ( touchPad )
                    {   
                        // For a touchpad, let's just set the position directly based on distance from initial touchdown
                        position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 );
                        position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 );
                    }
                    else
                    {                   
                        // Change the location of the joystick graphic to match where the touch is
                        gui.pixelInset.x =  Mathf.Clamp( guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x );
                        gui.pixelInset.y =  Mathf.Clamp( guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y );       
                    }
                   
                    if ( touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled ) {
                        ResetJoystick();
                    }
                }           
            }
        }
       
        if ( !touchPad )
        {
            // Get a value between -1 and 1 based on the joystick graphic location
            position.x = ( gui.pixelInset.x + guiTouchOffset.x - guiCenter.x ) / guiTouchOffset.x;
            position.y = ( gui.pixelInset.y + guiTouchOffset.y - guiCenter.y ) / guiTouchOffset.y;
        }
       
        // Adjust for dead zone   
        var absoluteX = Mathf.Abs( position.x );
        var absoluteY = Mathf.Abs( position.y );
       
        if ( absoluteX < deadZone.x )
        {
            // Report the joystick as being at the center if it is within the dead zone
            position.x = 0;
        }
        else if ( normalize )
        {
            // Rescale the output after taking the dead zone into account
            position.x = Mathf.Sign( position.x ) * ( absoluteX - deadZone.x ) / ( 1 - deadZone.x );
        }
           
        if ( absoluteY < deadZone.y )
        {
            // Report the joystick as being at the center if it is within the dead zone
            position.y = 0;
        }
        else if ( normalize )
        {
            // Rescale the output after taking the dead zone into account
            position.y = Mathf.Sign( position.y ) * ( absoluteY - deadZone.y ) / ( 1 - deadZone.y );
        }
}

Hello, cl.9, it only rolls on the X axis. When I press up on the joystick, It will not go North or South.

That’s because the joystick’s vertical axis is y, the z axis is always 0.

Try this:

#pragma strict

var isDead : boolean = false;
var JoystickScript : Joystick;
var JoystickPos : Vector3;
var speed : float;

function Update () {
    if (!isDead) {
        JoystickPos = new Vector3(JoystickScript.position.x, 0, JoystickScript.position.y);
        if (Mathf.Abs(JoystickPos.x) > 0.4 || Mathf.Abs(JoystickPos.z) > 0.4) {
            rigidbody.AddForce(JoystickPos * speed * Time.deltaTime);
            Debug.Log("Hit Joystick");
        }
   
    }
}

Thanks. That did it. Amen