具体代码资源链接: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;
}
}