前言
开个坑记录一下开发以来遇到的一些坑,给大伙避避。本文持续更新!
1. 复用对象时,Trail Renderer会产生诡异拖尾的情况
在本次项目中,我的子弹对象使用了对象池复用bullet对象,这样考虑到bullet有tail renderer的缘故,每次复用,若正常先显示对象后改变坐标,则会在场景中出现很明显的拖尾效果,这明显不是我们想要的,下图对比正常我们需要的效果,以及出现问题的效果
错误效果
正确效果
这种错误情况出现的原因主要是,Trail Renderer只要对象坐标进行了移动就会产生拖尾效果,此时应该在修改完坐标后,手动去Clear一下Trail Renderer的轨迹,伪代码如下
Bullet bullet = Pool.Get(); // 从对象池取出对象
bullet.transform.position = muzzle.transform.position; // 修改对象坐标
bullet.GetComponent<TrailRenderer>().Clear(); // 手动清除一下修改坐标后TrailRenderer的遗留轨迹 **这里就是需要新增的地方**
2. 修改Rigidbody2D的Velocity不生效的情况
同样是上面对象池的情况,在取出来一个对象后,需要给对象的Rigidbody赋予一个初速度的情况,由于我本人习惯在初始化完成后,才会将对象的active
设为true
,所以才会碰上这个bug,我的伪代码如下
Bullet bullet = Pool.Get(); // 从对象池取出对象
bullet.GetComponent<Rigidbody2D>().Velocity = TargetVelocity; // 设置刚体速度
bullet.gameobject.SetActive(true);
这种情况,在对象还未设置active为true之前就将刚体速度设置好,导致的结果就是velocity设置后,刚体的sleep state依旧是asleep,由此velocity就无法成功设置上,就会出现一个奇怪的现象,明明对象active
是true
的,但刚体却是asleep
状态,相反对象active
为false
的时候刚体反而是awake
,解决方法就是先将gameobject的active
设为true
后再对其刚体进行赋值。
Bullet bullet = Pool.Get(); // 从对象池取出对象
bullet.gameobject.SetActive(true);
bullet.GetComponent<Rigidbody2D>().Velocity = TargetVelocity; // 设置速度
未完待续
后续不定期更新文章