我们在上一节解决了坦克移动的问题,这一节我们学习子弹的制作。
其他实体一样,我们从我们的素材中找到子弹样式的图片,拖入场景,调整大小比例为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;
}
}
效果是这个样子:(图是静止的,凑合着看吧,啊哈哈哈哈)
然后我们给子弹添加一个触发器:
然后给子弹添加一个刚体:
转载请注明出处