【Unity 3d + C#】2d游戏坦克大战开发详解(三)

三、子弹的制作

我们在上一节解决了坦克移动的问题,这一节我们学习子弹的制作。

其他实体一样,我们从我们的素材中找到子弹样式的图片,拖入场景,调整大小比例为3:3:3,并且重命名为Bullet,添加预制体:

【Unity 3d + C#】2d游戏坦克大战开发详解(三)_第1张图片

子弹已经拖入场景了,现在我们来写一下子弹攻击的方法!

我们先在类的最上面定义一个子弹的类型:

public GameObject bulletPrefab;		//bullet

然后加入我们的攻击方法:监听键盘上是否按了空格键,如果按下了空格键,就实例化一个子弹。

private void attack(){
	if (Input.GetKeyDown (KeyCode.Space))
	{
		Instantiate (bulletPrefab, transform.position, transform.rotation);
	}
}

接下来等待编译,编译完成之后,打卡界面,将预制体bullet拖过去就ok了!

【Unity 3d + C#】2d游戏坦克大战开发详解(三)_第2张图片

但是这时候却发现子弹很别扭,无论我们的坦克头朝向哪边,子弹头都是朝向右边的。现在我们想办法让子弹根据车头朝向自己旋转。

我们可以很快的得出:子弹当前的角度=当前坦克的角度+子弹应该旋转的角度!所以我们改一下我们攻击方法的代码:

private Vector3 bulletEuluerAngels;
private void attack(){
	if (Input.GetKeyDown (KeyCode.Space))
	{
		Instantiate (bulletPrefab, transform.position, Quaternion.Euler(transform.eulerAngles+bulletEuluerAngels));
	}
}

然后在坦克的移动方法里实时更新bulletEuluerAngels,方法如下:

private void Move()
{
	//right and left
	float rl = Input.GetAxisRaw("Horizontal");
	transform.Translate(Vector3.right * rl * moveSpeed * Time.fixedDeltaTime, Space.World);
	if (rl < 0)
	{
		sr.sprite = tankSprite[3];
		bullectEulerAngles = new Vector3(0, 0, 90);
	}

	else if (rl > 0)
	{
		sr.sprite = tankSprite[1];
		bullectEulerAngles = new Vector3(0, 0, -90);
	}

	if (rl != 0)
		return;

	//up and down
	float ud = Input.GetAxisRaw("Vertical");
	transform.Translate(Vector3.up * ud * moveSpeed * Time.fixedDeltaTime, Space.World);

	if (ud < 0)
	{
		sr.sprite = tankSprite[2];
		bullectEulerAngles = new Vector3(0, 0, -180);
	}

	else if (ud > 0)
	{
		sr.sprite = tankSprite[0];
		bullectEulerAngles = new Vector3(0, 0, 0);
	}
}

现在已经解决了子弹的朝向问题,现在我们要让子弹按照目前的方向动起来!

我们给预制体bullet加一个C#脚本,设置一个子弹移动速度,然后移动就完事儿了,看代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour {

	public float BulletMoveSpeed=10;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		transform.Translate (transform.up * BulletMoveSpeed * Time.deltaTime, Space.World);
	}
}

等待编译之后,就可以看到我们的子弹沿着自身的方向动了,现在我们给子弹加入CD。

加入CD的方法很简单,只需要加个计时器就可以了:

public float temp=0;
private void FixedUpdate()
{

	Move ();
	if (temp >= 0.4f) {
		Attack ();
	} else {
		temp += Time.fixedDeltaTime;
	}
}

//Tank attack
private void Attack()
{
	if (Input.GetKeyDown(KeyCode.Space))
	{
		
		Instantiate(bullectPrefab, transform.position,Quaternion.Euler(transform.eulerAngles+bullectEulerAngles));
		temp = 0;
	}
}

效果是这个样子:(图是静止的,凑合着看吧,啊哈哈哈哈)

【Unity 3d + C#】2d游戏坦克大战开发详解(三)_第3张图片

 然后我们给子弹添加一个触发器:

【Unity 3d + C#】2d游戏坦克大战开发详解(三)_第4张图片

然后给子弹添加一个刚体:

【Unity 3d + C#】2d游戏坦克大战开发详解(三)_第5张图片


转载请注明出处

你可能感兴趣的:(Unity,3D实战项目)