u3d之摇杆技术

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u3d_20171030/article/details/79167882

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

 这个时候该发挥程序员的功能了,开动脚本
    public ETCJoystick 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[8] { 0, 0, -1, 1, 0.707f, -0.707f, -0.707f, 0.707f };
    private float[] z_scale = new float[8] { 1, -1, 0, 0, 0.707f, 0.707f, -0.707f, -0.707f };
    private float[] rot = new float[8] { 0, 180, -90, 90, 45, -45, -135, 135 };

    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<=0.25)//确定摇杆移动得够多,防止误操作
        {
            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, 0, 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>7*Mathf.PI/8||r<=-7*Mathf.PI/8)
        {
            return (int)DIR.LEFT;
        }
        else if (r > -7 * Mathf.PI / 8 && r <= -5 * Mathf.PI / 8)
        {
            return (int)DIR.LD;
        }
        else if (r > -5 * Mathf.PI / 8 && r <= -3 * Mathf.PI / 8)
        {
            return (int)DIR.DOWN;
        }
        else if (r > -3 * Mathf.PI / 8 && r <= -1 * Mathf.PI / 8)
        {
            return (int)DIR.RD;
        }
        else if (r > -1 * Mathf.PI / 8 && r <= Mathf.PI / 8)
        {
            return (int)DIR.RIGHT;
        }
        else if (r > Mathf.PI / 8 && r <= 3 * Mathf.PI / 8)
        {
            return (int)DIR.RU;
        }
        else if (r > 3 * Mathf.PI / 8 && r <= 5 * Mathf.PI / 8)
        {
            return (int)DIR.UP;
        }
        else if (r > 5 * Mathf.PI / 8 && r <= 7 * Mathf.PI / 8)
        {
            return (int)DIR.LU;
        }
        return (int)DIR.UP;
    }
/// <summary>
/// 方向
/// </summary>
enum DIR
{
    NO_MUVE = -1,

    UP = 0,
    DOWN = 1,
    LEFT = 2,
    RIGHT = 3,

    RU = 4,
    LU = 5,
    LD = 6,
    RD = 7
}
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;

猜你喜欢

转载自blog.csdn.net/u3d_20171030/article/details/79167882