当前位置: 首页 > 工具软件 > Angel 2D > 使用案例 >

Unity2d 坦克大战 (一)坦克移动、转向、皮肤切换

徐德海
2023-12-01

具体代码资源链接:https://download.csdn.net/download/qq_36680300/80971020

不是说tank切换一个方向就换一个方向的图片显示,而是移动要添上转向,这样写对后续皮肤切换也比较方便。

//Tank转向
private void Turn(Vector3 moveVector)
{
    var angel = Vector3.Angle(transform.right, moveVector);
    var normal = Vector3.Cross(transform.right, moveVector);
    angel *= Mathf.Sign(Vector3.Dot(transform.forward, normal));
    var vector = transform.right.normalized - moveVector.normalized;
    if (vector.magnitude > 0.1f)
    {
        transform.Rotate(transform.forward, angel);
    }

}

移动相对要简单一些,网上相应的代码也很多,就是判断向哪个方向移动的时候调用写好的Trun()就行。

    private void Move()
    {
        float v = Input.GetAxisRaw("Vertical");//y轴
        transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (v < 0)//下
        {
            bulletEulerAngles = new Vector3(0, 0, -180);
            moveVector = new Vector3(-1, 0, 0);
            Turn(moveVector);
        }
        else if (v > 0)//上
        {
            bulletEulerAngles = new Vector3(0, 0, 0);
            moveVector = new Vector3(1, 0, 0);
            Turn(moveVector);
        }

        if (v != 0)
        {//防止斜走,设置垂直优先级高于水平
            return;
        }
        // 音效播放
        if (Mathf.Abs(v) > 0.05f)
        {
            moveAudio.volume = 0.1f;
            moveAudio.clip = tankAudio[1];
            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }
        }


        float h = Input.GetAxisRaw("Horizontal");//x轴
        transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (h < 0)//左
        {
            bulletEulerAngles = new Vector3(0, 0, 90);
            moveVector = new Vector3(0, 1, 0);
            Turn(moveVector);
        }
        else if (h > 0)//右
        {
            bulletEulerAngles = new Vector3(0, 0, -90);
            moveVector = new Vector3(0, -1, 0);
            Turn(moveVector);
        }
        // 音效播放
        if (Mathf.Abs(h) > 0.05f)
        {
            moveAudio.volume = 0.1f;
            moveAudio.clip = tankAudio[1];
            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }
        }
        else
        {
            moveAudio.volume = 0.1f;
            moveAudio.clip = tankAudio[0];
            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }

        }
    }

需要注意的是为了防止斜走,水平和垂直移动之间最好设置优先级,固定一方不为零的时候直接return。

还有就是move()不要放在update()里面,因为update()是每帧刷新,但每帧时间是不固定的,放里面会出现鬼畜抖动的效果,需要固定更新的方法应该放在FixedUpdate()。

皮肤切换很简单,先 public Sprite[] 再写一个方法,在方法里switch坦克等级,更换相应的sprite皮肤就行。

// 改变皮肤
private void TankChange(int tl)
{
    switch (tl)
    {
        case 0:
            sr.sprite = tankSkin[0];
            break;
        case 1:
            sr.sprite = tankSkin[1];
            break;
        case 2:
            sr.sprite = tankSkin[2];
            break;
        case 3:
            sr.sprite = tankSkin[3];
            break;
        default:
            break;
    }

}
 类似资料: