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

三、子弹的制作

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

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

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

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

public GameObject bulletPrefab;		//bullet

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

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

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

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

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

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;
	}
}

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

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

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


转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值