天天看點

u3d之搖杆技術

1. 下載下傳搖杆插件(我上傳了一個)

![這裡寫圖檔描述](https://img-blog.csdn.net/20180125231505826?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTNkXzIwMTcxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
           

2. 建立一個Easytouch

點選"creat"建立Easytouch
 ![這裡寫圖檔描述](https://img-blog.csdn.net/20180125231611287?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTNkXzIwMTcxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
           

3. 建立joystick

右鍵點選建立出來的Easytouch來建立joystick
 ![這裡寫圖檔描述](https://img-blog.csdn.net/20180125231943222?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTNkXzIwMTcxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)    
           

4. 擷取joystick

這個時候該發揮程式員的功能了,開動腳本
           

5. 根據joystick的axisX和axisY值來确定方向

在Update()中不斷擷取值
           
float j_x = joystick.axisX.axisValue;
        float j_y = joystick.axisY.axisValue;
           

6. 有了axis的值就可以進而用來做各種事情,這裡舉個例子,用來控制角色移動

private CharacterController player;//角色控制器
    private float[] x_scale = new float[] { , , -, , , -, -,  };
    private float[] z_scale = new float[] { , -, , , , , -, - };
    private float[] rot = new float[] { , , -, , , -, -,  };

    void Start () {
        player = transform.GetComponent<CharacterController>();
    }
           
這裡建立的數字x_scale和y_scale都是八個值,在二維坐标中如果取點(x_scale[值],y_scale[值]),這樣一個點,在中括号中的"值"就是一個int資料,這樣會存在八個點.這八個點就是上、下、左、右、左上、左下、又上、右下,這八個位置。
這裡就是搖杆的八個點,當拖動搖杆位于這八個點,再連接配接原點形成的線段與x軸相交,角度就是rot數組裡面的八個角度,也就是主角的朝向,方向确定了,隻要讓主角向前移動就實作了主角控制移動效果
必須提到的是——這個搖杆本身就位于原點,以原點為中心,半徑1畫圓,當拖動搖杆到圓形的最右時候,就得到一個點(1,0),最上面的點就是(0,1),右上角的點就約為(0.707,0.707)。
我們定下了這八個點,當搖杆靠近時候就認為主角要向這個方向移動。是以用以下方法确定方向。
           
void Update () {
        float j_x = joystick.axisX.axisValue;
        float j_y = joystick.axisY.axisValue;
        if(j_x*j_x+j_y*j_y<=)//确定搖杆移動得夠多,防止誤操作
        {
            return;
        }
        float r = Mathf.Atan2(j_y, j_x);//計算角度
        int dir=get_dir(r);//擷取方向
        float s = speed * Time.deltaTime;
        float sx=x_scale[dir]*s;
        float sz=z_scale[dir]*s;
        player.Move(new Vector3(sx, , sz));

        Vector3 rot = this.transform.localEulerAngles;
        rot.y = this.rot[dir];
        this.transform.localEulerAngles = rot;
    }
    /// <summary>
    /// 根據tan值确定移動方向
    /// </summary>
    /// <param name="r">tan值</param>
    /// <returns>移動方向</returns>
    int get_dir(float r)
    {
        if (r>*Mathf.PI/||r<=-*Mathf.PI/)
        {
            return (int)DIR.LEFT;
        }
        else if (r > - * Mathf.PI /  && r <= - * Mathf.PI / )
        {
            return (int)DIR.LD;
        }
        else if (r > - * Mathf.PI /  && r <= - * Mathf.PI / )
        {
            return (int)DIR.DOWN;
        }
        else if (r > - * Mathf.PI /  && r <= - * Mathf.PI / )
        {
            return (int)DIR.RD;
        }
        else if (r > - * Mathf.PI /  && r <= Mathf.PI / )
        {
            return (int)DIR.RIGHT;
        }
        else if (r > Mathf.PI /  && r <=  * Mathf.PI / )
        {
            return (int)DIR.RU;
        }
        else if (r >  * Mathf.PI /  && r <=  * Mathf.PI / )
        {
            return (int)DIR.UP;
        }
        else if (r >  * Mathf.PI /  && r <=  * Mathf.PI / )
        {
            return (int)DIR.LU;
        }
        return (int)DIR.UP;
    }
/// <summary>
/// 方向
/// </summary>
enum DIR
{
    NO_MUVE = -,

    UP = ,
    DOWN = ,
    LEFT = ,
    RIGHT = ,

    RU = ,
    LU = ,
    LD = ,
    RD = 
}
           
tan()傳回的是一個角度所對應的弧度,比如當x和y都等于一,就會傳回tan(45)所對應的弧度值——1.而這個1即是右上角的方向。對應數組的第【4】個位置:x_scale[4]和y_scale[4]。那個枚舉數組隻是為了友善記住方向所對應的數組位置而已。
這裡代碼的思路:我們把角度換算成弧度友善計算,把360度也就是2π分成八個範圍,當搖杆進入不同範圍既認為向數組x_scale和y_scale所組成的八個點方向移動。
而rot數組就是這八個點所對應的角度,如果畫圖分析則更加清楚。轉換成弧度隻是為了友善計算,而我們使用角色控制器控制角色朝向用的是歐拉角,是以得用角度,這裡rot數組跟其他兩個數組是對應的。比如:如果x和y都等于1,對應的數組x_scale和y_scale下标都為4,rot也一樣為[4]也就是45度,即可調主角整歐拉角度,而主角又是繞着y軸旋轉,是以用了這個代碼來調整主角朝向
           
Vector3 rot = this.transform.localEulerAngles;
        rot.y = this.rot[dir];
        this.transform.localEulerAngles = rot;