Unity射击游戏发射子弹的方法和提升流畅性的小技巧

引言

在某些射击游戏里(2D和3D都适用),可能你需要创建子弹,第一想到的可能是新建一个发射子弹的脚本,就叫BulletController,然后每次按下什么键就直接上Instantiate函数。

伪代码如下:
public GameObject bullet;//子弹预制件

private void Update()
{
	if(某些触发事件导致需要发射子弹)
	{
		Shoot();
	}
}

private void FixedUpdate()
{
	Move();
}

private void Shoot()
{
	Instantiate(bullet, 需要从哪发射的position, Quaternion.identity);
}

private void Move()
{
	transform.Translate(速度的三维向量);
}

这种方法很简单,但是假如子弹种类多了,那么每一个子弹都需要创建一个相同作用的脚本,唯一区别就是bullet预制件不一样。代码耦合性很高,逻辑性很差。因为想一想现实生活,子弹应该是控制位置的,发射子弹不是应该是枪该做的是吗?


第二种想法是创建一个GunController脚本和一个BulletController,然后每次需要发射子弹的时候让GunController来控制发射子弹。BulletController则是控制子弹的运动。

GunController的部分伪代码
public GameObject bullet;//子弹预制件

private void Update()
{
	if(某些触发事件导致需要发射子弹)
	{
		Shoot();
	}
}

private void Shoot()
{
	Instantiate(bullet, 需要从哪发射的position, Quaternion.identity);
}
Bulletontroller的部分伪代码
private void FixedUpdate()
{
	Move();
}

private void Move()
{
	transform.Translate(速度的三维向量);
}

这样就使得代码很简洁,而且耦合性很低,逻辑更加合理。

其实写到这也差不多了,但是如果是那种大型游戏,每次射击都需要创建一个新的子弹,如果子弹很多,那么会造成一些配置比较低的电脑卡顿,导致玩家体验效果极差。下面就用到了的思想,把所有的子弹都放到池(可以用容器List)里,当需要创建子弹的时候,先看看子弹池里面有没有子弹,如果有子弹,直接拿一个出来就可以了,不需要新建一个子弹了;如果没有子弹,那么就新建一个子弹就ok了。其实只是一开始需要创建子弹,后面基本都是复用子弹,不用创建子弹的了。
下面上伪代码

GameManager脚本代码
public GameObject bullet;//子弹预制件

public List<GameObject> bulletPool;//子弹池

//第一个参数是需要创建子弹的位置
public GameObject MakeBullet(Vector3 pos)
{
        if(playerBulletPool.Count > 0)
        {
                //从子弹池取出一个子弹
                bullet = playerBulletPool[0];
                playerBulletPool.RemoveAt(0);
                bullet.transform.position = pos;
                bullet.SetActive(true);
        }
        else
        {
                //新建一个子弹
                bullet = Instantiate(bullet, pos, Quaternion.identity);
        }
        return bullet;
}
GunController的部分伪代码
private void Update()
{
	if(某些触发事件导致需要发射子弹)
	{
		Shoot();
	}
}

private void Shoot()
{
	GameObject newBullet = GameManager.Ins.MakeBullet(transform.position);
}

总结

其实这个思想很值得学习,也不一定用到子弹这个例子,例如共享单车什么的,也是利用复用这个思想。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要让敌人在Unity射击发射子弹,你需要创建一个敌人和一个子弹对象,然后编写脚本来控制它们的行为。 首先,创建一个敌人和一个子弹的预制体,在它们的Transform组件中设置好相应的初始位置和旋转角度。 在敌人的脚本中,你需要定义敌人的射击行为。这通常包括以下步骤: 1. 设置敌人的射击频率和射击的时间间隔。 2. 在固定的时间间隔内,实例化一个子弹对象。 3. 设置子弹的初始位置和方向,使其从敌人的位置朝向玩家飞行。 4. 给子弹添加一个刚体组件,以便它可以在空中移动。 5. 添加子弹的碰撞检测,以便它可以与玩家或其他游戏对象碰撞并造成伤害。 下面是一个简单的敌人脚本示例,可以让敌人在Unity发射子弹: ```csharp public class EnemyShoot : MonoBehaviour { public GameObject bulletPrefab; // 子弹预制体 public Transform bulletSpawnPoint; // 子弹发射位置 public float fireRate = 1f; // 射击频率 private float nextFireTime; // 下一次射击时间 // 敌人射击行为 private void Shoot() { if (Time.time > nextFireTime) { nextFireTime = Time.time + fireRate; GameObject bullet = Instantiate(bulletPrefab, bulletSpawnPoint.position, Quaternion.identity); bullet.transform.LookAt(PlayerController.instance.transform.position); // 调整子弹方向 bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 10f; // 子弹速度 Destroy(bullet, 3f); // 3秒后销毁子弹 } } private void Update() { Shoot(); // 每帧检测是否可以射击 } } ``` 在上面的脚本示例中,我们通过使用Instantiate()方法来实例化一个子弹对象,并设置它的位置和方向。然后,我们使用LookAt()方法调整子弹的方向,使其朝向玩家。最后,我们通过给子弹添加一个刚体组件,并将它向前移动,来让子弹在空中飞行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就一枚小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值