二、简单的武器
1.在场景中添加一个圆柱体(Cylinder),reset一下之后,调整大小、方向和材质,使它变成一个长条形,使它的Z轴(蓝色轴)向外,就像一把枪一样,然后把它重命名为Gun,最后把它变成Player的子物体
2.创建一个发射子弹的地方。在场景中创建一个空物体,放到枪口的位置,蓝色轴(Z轴)对外,名称改为ShootPoint,然后把它也拖拽到Player下,变成Player的子物体。
3.制作子弹预制体。在场景中创建一个球体,reset一下,然后调整大小和材质,名称改为Bullet;给球体增加刚体(RigidBody)属性,并勾掉使用重力(Use Gravity)选项;把这个球体拖拽到Project面板中,使其成为一个预制体,最后删除Hierarchy面板中的Bullet。
4.编写发射子弹的脚本。新建一个Script,命名为Shoot,挂载在Player上,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shoot : MonoBehaviour
{
public GameObject BulletPrefab;
//定义一个公有类型的Transform 用来实例化一个要跟随的对象
public Transform BulletSpawn;
//定义一个子弹发射的速度
public float BulletSpeed = 20;
//Update里面的语句每一帧都会执行
void Update()
{
//判断是否按下了鼠标左键
if (Input.GetMouseButtonDown(0))
{
//克隆一个子弹预制体,位置和角度与发射点相同
GameObject bullet = Instantiate(BulletPrefab, BulletSpawn.position, BulletSpawn.rotation);
//给子弹的刚体一个向前的速度
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * BulletSpeed;
//2秒后销毁子弹的克隆体
Destroy(bullet, 2);
}
}
}
5.把做好的子弹预制体拖拽给BulletPrefab,把ShootPoint拖拽给BulletSpawn。
6.运行游戏,测试一下,点击鼠标左键,就会发射出子弹,2秒后,子弹的克隆体就会消失
现在只是单发,如果想要连发,可以把Shoot脚本换成下面的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shoot : MonoBehaviour
{
//定义子弹预制体
public GameObject BulletPrefab;
//定义一个公有类型的Transform 用来实例化一个要跟随的对象
public Transform BulletSpawn;
//定义一个子弹发射的速度
public float BulletSpeed = 20;
private bool isFiring = false; // 添加一个状态标志来表示当前是否正在连发
private void Start()
{
}
//Update里面的语句每一帧都会执行
void Update()
{
//连发效果
if (Input.GetMouseButtonDown(0) && !isFiring)
{
// 开始连发
StartCoroutine(FireBullets());
}
else if (Input.GetMouseButtonUp(0))
{
// 停止连发
isFiring = false;
}
IEnumerator FireBullets()
{
isFiring = true;
while (isFiring && currentBulletCount > 0)
{
GameObject bullet = Instantiate(BulletPrefab, BulletSpawn.position, BulletSpawn.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * BulletSpeed;
Destroy(bullet, 2);
yield return new WaitForSeconds(0.12f);
}
}
}
}
7.实现枪随着摄像机的角度抬高或降低。给ShootPoint物体增加一个Script脚本,命名为FollowGun,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowGun : MonoBehaviour
{
//创建一个公有的用于实例化的物体Follow 到时候要跟着谁转动 就把谁赋值给这个
public GameObject Follow;
//在脚本里面创建一个游戏对象 ShootPoint 用于获取Follow的信息
GameObject ShootPoint;
void Update()
{
//获取要实例化对象的信息 ShootPoint就相当于游戏外面拖拽进来的物体了
ShootPoint = Follow;
//transform.rotation也可以写成This.transform.rotation 也就是当前脚本所挂物体的角度
//等于外面拖拽进来物体的角度 由于在Update方法里面 所以每帧都会更新 达到一个同步的现象
transform.rotation = ShootPoint.transform.rotation;
}
}
然后把Hierarchy面板中的Gun拖拽到Follow中
给Gun也挂载一个FollowGun脚本,然后把MainCamera拖拽到Follow中
这样,枪就可以随着摄像机旋转了,而开火位置(shootPoint)随着枪旋转,单击鼠标左键会发射子弹。这个里面还有一些小BUG,比如开火位置与枪口之间会有一小段偏移量,后面我会想办法解决。
引用链接: