1.第一步:承接第一大部分的内容,前面实现了让飞机动起来,那么我们接下来便是要让飞机能够发射子弹。以同样的方法将子弹对象拉到场景中,通过右边的检查器(Inspector)那一栏调整大小等属性,同样为子弹添加Box Collider(盒碰撞器)。
2.第二步:在设定好子弹后便开始使子弹动起来,我们要做到让子弹向屏幕的Y轴正向移动。首先我们在Assets的scripts文件夹里面创建一个C#脚本,名为Ammo,双击脚本进行编辑。代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ammo : MonoBehaviour
{
public Vector3 Direction = Vector3.up; //移动的方向
public float Speed = 20.0f; //子弹移动速度
public float LifeTime = 10.0f; //子弹存留时间
// Start is called before the first frame update
void Start()
{
//Invoke(“方法名”,间隔时间) 即每隔多少时间执行一次某方法。
Invoke("DestroyMe", LifeTime);
}
// Update is called once per frame
void Update()
{
//以一定的速度改变子弹的移动位置
transform.position += Direction * Speed * Time.deltaTime;
}
void DestroyMe()
{
//销毁场景里的子弹对象
Destroy(gameObject);
}
}
3.第三步:在写完Ammo这个脚本并保存后,点击子弹对象,将这个脚本拖到子弹的右边的检查器(Inspector)那一栏,然后便可以设定以及改变子弹的运动属性,包括其运动方向,速度,以及子弹的存在时间,过了之后会自动销毁。运行程序后便会发现子弹会根据所设定的方向按照设定的速度运动以及毁灭。
4.第四步:这时只是一个子弹的运动,而我们希望的是子弹是在我们按下发射按钮后才出现并移动的。所以我们这里要引入“预设”(Prefab)。预设是一种资源,它可以变成场景中任何其他对象的一个副本,对于子弹来说,进行预设后,以后使用子弹只要调用预设就行,这里子弹的预设就好比一个装有无限个子弹的弹夹,每次从其中调用相同的子弹。具体的操作便是将左边层级(“Hierarchy”)部分的子弹对象拖到下方的Assets中,然后便会发现左边你所拖的对象变为蓝色,同时Assets也多了一个你所拖的对象。
5.第五步:子弹的预设好了之后,便要设置子弹的发射位置,因为发射子弹时子弹需要一个起始位置,也就是飞机的头部,飞机移动,子弹的发射位置也会跟着移动,方法:首先我们点击上方的 GameObject | Create Empty命令,创建一个新的空对象,命名为Canno_dummy,这个对象是虚拟的,因为它在场景中没有实物,同时这个对象只有一个组件,就是Transform,同来设定位置。然后我们将这个对象拖到同一栏的spaceship处,这样这个对象就会绑定在飞机上,随着飞机的运动也跟着运动,将场景中Canno_dummy对象调到机头处。
6.第六步:然后便是在每次点击后都是发射子弹,这时我们需要添加修改之前写的PlayerController脚本文件,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
//飞船生命值
public int Health = 100;
//两发子弹间隔时间
public float ReloadDelay = 0.2f;
//这里是方便传入两个所需的游戏对象,一个是预设对象,一个是开火位置
public GameObject PrefabAmmo = null;
public GameObject GunPosition = null;
//true时说明可以开火,flase时不能开火
private bool WeaponsActivated = true;
//飞船每秒移动的单元的个数
public float Speed;
//保证飞船在上下左右移动
public Vector3 MinMaxX = Vector3.zero;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update() //控制飞船上下左右移动
{
transform.position =
new Vector3(
Mathf.Clamp( //Mathf.Clamp限制x移动范围,Input.GetAxis("Horizontal")获取键盘左右移动
transform.position.x + Input.GetAxis("Horizontal") * Speed * Time.deltaTime,
MinMaxX.x,
MinMaxX.y),
//transform.position.y,
Mathf.Clamp( //Mathf.Clamp限制y移动范围,Input.GetAxis("Vertical")获取键盘上下移动
transform.position.y + Input.GetAxis("Vertical") * Speed * Time.deltaTime,
MinMaxX.z,
5),
transform.position.z
);
}
void LateUpdate() //用于实现子弹发射
{
//当按下发射按钮时,让鼠标按下的时候一直执行 需要使用Input.GetButton("Fire1")
if (Input.GetButton("Fire1") && WeaponsActivated)
{
//创建一个新子弹
//参数一:是预设(在预设中已设定好子弹的属性) 参数二:实例化预设的坐标 参数三:实例化预设的旋转角度
Instantiate(PrefabAmmo, GunPosition.transform.position,
PrefabAmmo.transform.rotation);
WeaponsActivated = false;
Invoke("ActivateWeapons", ReloadDelay);
}
}
//允许发射子弹
void ActivateWeapons()
{
WeaponsActivated = true;
}
}
7.第七步:脚本写好后保存,点击飞机对象,便可以看到右边的检查器(Inspector)那一栏的Player Controller(scripts)多出来三个可以调节的属性,分别是
ReloadDelay:用来设定子弹发射间隔
PrefabAmmo:用来选定预设对象的
GunPosition:用来选定发射位置的
分别设定这三个属性,其中设定PrefabAmmo需要点击右边那个小圈圈,然后选择之前设定好的预设对象Ammo,同样的设定GunPosition,需要点击右边那个小圈圈,然后在弹出的框框上点击Scene,选择其中的Canno_dummy。
在设定完成后,切记删掉场景中创建的那个Ammo,不然会有冲突,删掉就OK了
然后游戏运行之后便可以通过点击鼠标左键进行射击。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。