团结|通过触摸动态创建和销毁Jostick

时间:2015-03-09 06:35:00

标签: unity3d unityscript

我想创建一个jostick创建(Instatiated或其他)触摸位置(Input.getTouch(i).position)并在用户不再触摸屏幕时销毁。这是下面的源代码。请告诉我如何做到这一点。谢谢。

using UnityEngine;
using System.Collections;

public class joy : MonoBehaviour

{

public GameObject joystick; //Self explanitory
public GameObject bg; //Background object for the joystick boundaries
public const float deadzone = 0f; //Deadzone for the joystick
public const float radius = 2.0f; //The radius that the joystick thumb is allowed to move from its origin
public Camera cam;

protected Collider joyCol;
protected int lastfingerid = -1; //Used for latching onto the finger

public Vector2 position = Vector2.zero;


void Awake ()
{   
    joyCol = bg.GetComponent<Collider>();

}

public void Disable ()
{
    gameObject.active = false; //Turns off the joystick when called
}

public void ResetJoystick () //Called when the joystick should be moved back to it's original position (relative to parent object)
{
    lastfingerid = -1;
    joystick.transform.localPosition = Vector3.zero;
}

void Update ()
{
    if (Input.touchCount == 0)
    {
        ResetJoystick (); //I would have figured this would be obvious? :P
    }
    else
    {
        for (int i=0; i < Input.touchCount; i++)
        {
            Touch touch = Input.GetTouch(i);
            bool latchFinger = false;
            if (touch.phase == TouchPhase.Began) //When you begin the touch, the code here gets called once
            {

                //Vector3 touchpos = Input.GetTouch(i).position;
                //touchpos.z = 0.0f;
                //Vector3 createpos = cam.ScreenToWorldPoint(touchpos);
                Ray ray = cam.ScreenPointToRay (touch.position); //Creates a ray at the touch spot
                RaycastHit hit; //Used for determining if something was hit

                //joystick = (GameObject)Instantiate(Resources.Load("Type3/joystick"),createpos, Quaternion.identity);
                //bg = (GameObject)Instantiate(Resources.Load("Type3/Bg"),createpos, Quaternion.identity);


                if (joyCol.Raycast(ray,out hit,Mathf.Infinity)) //The ray hit something...
                {
                    if (hit.collider == joyCol) //Apparently, that ray hit your joystick
                    {
                        latchFinger = true; //This turns on and sets off a chain reaction
                    }
                }
            }

            if (latchFinger ) //Latch finger being true turns this code on
            {
                if ((lastfingerid == -1 || lastfingerid != touch.fingerId)) 
                {
                    lastfingerid = touch.fingerId;
                }
            }

            if (lastfingerid == touch.fingerId) //The real meat of the code
            {
                Vector3 sTW = cam.ScreenToWorldPoint (new Vector3 (touch.position.x, touch.position.y, 1)); //Transforms the screen touch coordinates into world coordinates to move our joystick
                joystick.transform.position = sTW; //Hurr :O
                joystick.transform.localPosition = new Vector3(joystick.transform.localPosition.x,joystick.transform.localPosition.y,0);
                //float xClamp = Mathf.Clamp (joystick.transform.localPosition.x, xClampMin, xClampMax); //Limit movement to the boundaries
                //float yClamp = Mathf.Clamp (joystick.transform.localPosition.y, yClampMin, yClampMax);


                /*float distFromCenter = Mathf.Sqrt(joystick.transform.localPosition.x*joystick.transform.localPosition.x + joystick.transform.localPosition.y*joystick.transform.transform.localPosition.y);

                float actualPercent = Mathf.Clamp01(distFromCenter/radius);

                float percent = Mathf.Clamp01((distFromCenter - deadzone)/(radius - deadzone));
                */

                joystick.transform.localPosition = Vector3.ClampMagnitude(joystick.transform.localPosition,radius);






                //joystick.transform.localPosition = new Vector3 (xClamp, yClamp, joystick.transform.localPosition.z); //Finally, the joystick moves like it should with everything in place

                if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
                {
                    ResetJoystick ();
                }
            }

            Ray touchray = cam.ScreenPointToRay (touch.position); //Creates a ray at the touch spot
            //RaycastHit hit; //Used for determining if something was hit
            Debug.DrawRay (touchray.origin, touchray.direction * 100, Color.yellow); //Delete this line. It's not important.


        }
    }

    //set our position variables x and y values to the joysticks values but clamped to a percent value instead of world coords
    position.x = joystick.transform.localPosition.x/radius;
    position.y = joystick.transform.localPosition.y/radius;

    if(position.magnitude < deadzone)
    {
        position.x = 0;
        position.y = 0;
    }


}
}

0 个答案:

没有答案