- Home /
The question is answered, right answer was accepted
GUITexture Touch Problem
I am trying to make a button for Android Input.Touch. But it doesn't work. Anyone can help please?
Here is the code:
using UnityEngine; using System.Collections;
public class AnInp : MonoBehaviour { public Texture2D myButton; // Use this for initialization void Start () { } // Update is called once per frame void Update () { Touch touch1; if(Input.touchCount > 0) { touch1 = Input.touches[0]; guiTexture.texture = myButton; if(touch1.phase == TouchPhase.Began && guiTexture.HitTest(touch1.position)) { Application.Quit(); }
} }
void OnGUI() { GUI.DrawTexture(new Rect(60,60,60,60), myButton, ScaleMode.StretchToFill, true, 10.0F); } /////////////////////////////////////////// }
I'm not sure HitTest works in Android, since it has no $$anonymous$$ouseInput and HitTest is based on $$anonymous$$ouse inputs. You should raycast your touch OR and much easier, use
if(GUI.Button(new rect(x,y,w,h),textureButton)){ Application.Quit(); }
p.s. this must of course be inside OnGUI() method.
Thanks for all. I need mul$$anonymous$$ch functions for a car and this will be the throttle in fact.
Answer by aldonaletto · Aug 18, 2012 at 03:57 PM
You're mixing different creatures: GUITexture and HitTest belong to the old gui system, while GUI.DrawTexture belongs to the new one - these systems are incompatible with each other, thus you should stick with one or the other.
 To use a GUITexture, select the button texture in the Project view and click menu GameObject/Create Other/GUI Texture, than add this modified version of your code to it:
using UnityEngine; using System.Collections;
public class AnInp : MonoBehaviour {
void Update () { Touch touch1; if(Input.touchCount > 0) { touch1 = Input.touches[0]; if(touch1.phase == TouchPhase.Began && guiTexture.HitTest(touch1.position)) { Application.Quit(); } } } } To use the new GUI system, just follow @J.D.'s suggestion: use GUI.Button instead of GUI.DrawTexture:
using UnityEngine; using System.Collections;
public class AnInp : MonoBehaviour {
public Texture2D myButton;
void OnGUI() { if (GUI.Button(new Rect(60,60,60,60), myButton){ Application.Quit(); } } }
Thanks for the advice but the button will not quit the app indeed. It will be a throttle button for a car and i need a mul$$anonymous$$ch script. I will try the new gui system. P.S: Sorry for my bad english.
I just tried the new gui system and the script. It was great man. Thanks a lot. I loved it. Now the question is can i put multiple guitextures from the gameobject/create menu and does it function mul$$anonymous$$ch(of coures until you answer me i will be testing:)). P.S: I am trying to make 4 touch buttons for accelaret, brake, left and right actions.
For mul$$anonymous$$ch, I guess you must use GUITextures. There's another function, GUILayer.HitTest, that can tell which GUITexture is at some specific point - maybe you could use it for each touch, like this (script attached to an empty object):
using UnityEngine; using System.Collections;
public class AnInp : $$anonymous$$onoBehaviour {
// drag the button GUITextures here: GUITexture accel; GUITexture brake; GUITexture left; GUITexture right;
void Update () { if (Input.touchCount > 0){ foreach (Touch touch1 in Input.touches){ // find the element touched: GUIElement button = GUILayer.HitTest(touch1.position); // verify which of your buttons is it: if (button == accel){ // accelerator touch } else if (button == brake){ // brake touch } else if (button == left){ // steer left touch } else if (button == right){ // steer right touch } } } } }
I'm on it at the moment. I will write the result. Thanks for helping me in this project. I have made a good car working on pc but i want to run it on Android and i am working for 10 ten days and had no proper result until your help. You are great :)
I tried it right now and having this error: Assets/Scripts/AnInp.cs(16,38): error CS0120: An object reference is required to access non-static member `UnityEngine.GUILayer.HitTest(UnityEngine.Vector3)' I think (maybe i'm thinking wrong) GUILayer touch position has to be defined in vectors but how, or the "button" must be an object?
Answer by alee26 · Aug 25, 2012 at 08:09 AM
 using UnityEngine;
 using System.Collections;
 
 [RequireComponent (typeof (Drivetrain))]
 
 public class CarController : MonoBehaviour {
 
     public Wheel[] wheels;
     public Transform centerOfMass;
     public float inertiaFactor = 1.5f;
     public float brake;
     public float throttle;
     float throttleInput;
     float steering;
     float lastShiftTime = -1;
     float handbrake;
     
     Drivetrain drivetrain;
     CarController carengine;
     
     public float shiftSpeed = 0.8f;
     public float throttleTime = 1.0f;
     public float throttleTimeTraction = 10.0f;
     public float throttleReleaseTime = 0.5f;
     public float throttleReleaseTimeTraction = 0.1f;
     public bool tractionControl = true;
     public float steerTime = 1.2f;
     public float veloSteerTime = 0.1f;
     public float steerReleaseTime = 0.6f;
     public float veloSteerReleaseTime = 0f;
     public float steerCorrectionFactor = 4.0f;
     //lights
     public Light solFren;
     public Light sagFren;
     public Light solFar;
     public Light sagFar;
     public Light solStop;
     public Light sagStop;
     public GUITexture accelTouch;
     public GUITexture brakeTouch;
     public GUITexture leftTouch;
     public GUITexture rightTouch;
 
     public float slipVelo {
         get {
             float val = 0.0f;
             foreach(Wheel w in wheels)
                 val += w.slipVelo / wheels.Length;
             return val;
         }
     }
 
     // Initialize
     void Start ()
     {
         if (centerOfMass != null)
         rigidbody.centerOfMass = centerOfMass.localPosition;
         rigidbody.inertiaTensor *= inertiaFactor;
         drivetrain = GetComponent (typeof (Drivetrain)) as Drivetrain;
     }
     
     public void Update () {
         if (Input.touchCount > 0){
         foreach (Touch touchControl in Input.touches){
         GUILayer touchLayer = Camera.current.GetComponent(typeof(GUILayer)) as GUILayer;
         GUIElement button = touchLayer.HitTest(touchControl.position);
                     // Steering
         Vector3 carDir = transform.forward;
         float fVelo = rigidbody.velocity.magnitude;
         Vector3 veloDir = rigidbody.velocity * (1/fVelo);
         float angle = -Mathf.Asin(Mathf.Clamp( Vector3.Cross(veloDir, carDir).y, -1, 1));
         float optimalSteering = angle / (wheels[0].maxSteeringAngle * Mathf.Deg2Rad);
         if (fVelo < 1)
             optimalSteering = 0;
                 
         bool steerLeft = (button == leftTouch);
         bool steerRight = (button == rightTouch);
         float steerInput = 0;
 
         if (steerLeft)
             steerInput = -1;
         if (steerRight)
             steerInput = 1;
                 
         if (steerInput < steering)
         {
             float steerSpeed = (steering>0)?(1/(steerReleaseTime+veloSteerReleaseTime*fVelo)) :(1/(steerTime+veloSteerTime*fVelo));
             if (steering > optimalSteering)
                 steerSpeed *= 1 + (steering-optimalSteering) * steerCorrectionFactor;
             steering -= steerSpeed * Time.deltaTime;
             if (steerInput > steering)
                 steering = steerInput;
         }
         else if (steerInput > steering)
         {
             float steerSpeed = (steering<0)?(1/(steerReleaseTime+veloSteerReleaseTime*fVelo)) :(1/(steerTime+veloSteerTime*fVelo));
             if (steering < optimalSteering)
                 steerSpeed *= 1 + (optimalSteering-steering) * steerCorrectionFactor;
             steering += steerSpeed * Time.deltaTime;
             if (steerInput < steering)
                 steering = steerInput;
         }
                 
         // Throttle/Brake
         bool accelKey = (button == accelTouch);
         bool brakeKey = (button == brakeTouch);
         
         if (drivetrain.automatic && drivetrain.gear == 0)
         {
             accelKey = (button == brakeTouch);
             brakeKey = (button == accelTouch);
         }
 
         if (accelKey)
         {
             if (drivetrain.slipRatio < 0.1f)
                 throttle += Time.deltaTime / throttleTime;
             else if (!tractionControl)
                 throttle += Time.deltaTime / throttleTimeTraction;
             else
                 throttle -= Time.deltaTime / throttleReleaseTime;
 
             if (throttleInput < 0)
                 throttleInput = 0;
             throttleInput += Time.deltaTime / throttleTime;
             brake = 0;
         }
         else 
         {
             if (drivetrain.slipRatio < 0.1f)
                 throttle -= Time.deltaTime / throttleReleaseTime;
             else
                 throttle -= Time.deltaTime / throttleReleaseTimeTraction;
         }
         throttle = Mathf.Clamp01 (throttle);
                 
         if (brakeKey)
         {
             if (drivetrain.slipRatio < 0.1f)
                 brake += Time.deltaTime / throttleTime;
             else
                 brake += Time.deltaTime / throttleTimeTraction;
             throttle = 0;
             throttleInput -= Time.deltaTime / throttleTime;
             solFren.light.intensity = 5;
             sagFren.light.intensity = 5;
         }
         else 
         {
             if (drivetrain.slipRatio < 0.1f)
                 brake -= Time.deltaTime / throttleReleaseTime;
             else
                 brake -= Time.deltaTime / throttleReleaseTimeTraction;
             solFren.light.intensity = 0;
             sagFren.light.intensity = 0;
         }
         brake = Mathf.Clamp01 (brake);
         throttleInput = Mathf.Clamp (throttleInput, -1, 1);
 
         // Handbrake
         handbrake = Mathf.Clamp01 ( handbrake + (Input.GetKey (KeyCode.Space)? Time.deltaTime: -Time.deltaTime) );
         
         // Gear shifting
         float shiftThrottleFactor = Mathf.Clamp01((Time.time - lastShiftTime)/shiftSpeed);
         drivetrain.throttle = throttle * shiftThrottleFactor;
         drivetrain.throttleInput = throttleInput;
         
         if(Input.GetKeyDown(KeyCode.A))
         {
             lastShiftTime = Time.time;
             drivetrain.ShiftUp ();
         }
         if(Input.GetKeyDown(KeyCode.Z))
         {
             lastShiftTime = Time.time;
             drivetrain.ShiftDown ();
         }
 
         // Apply inputs
         foreach(Wheel w in wheels)
         {
             w.brake = brake;
             w.handbrake = handbrake;
             w.steering = steering;
         }
     }
         }
     }
     // Debug GUI. Disable when not needed.
     void OnGUI ()
     {
         
         GUI.Label (new Rect(0,60,100,200),"km/h: "+rigidbody.velocity.magnitude * 3.6f);
         tractionControl = GUI.Toggle(new Rect(0,80,300,20), tractionControl, "Traction Control (bypassed by shift key)");
         
     }
 }
 
Follow this Question
Related Questions
GUITexture and Touch Input 1 Answer
Detect touch on a specific GUITexture 3 Answers
GUITextures refuse to be touched 1 Answer
Touch Button for 4 animation 2 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                