大家好,我叫JJQ,是《暴走熊孩》的主程序/主策划/制作人,和大家一样给商业游戏的轮子造多了,觉得有必要做一些让玩家玩而非玩玩家的游戏(有兴趣的人可以去想个绕口令( ̄▽ ̄)~*),就拉着几个小伙伴租了间办公室干了起来。
之前的一整年里一直都在做功能做优化,一篇日志都没写(主要还是懒),这回游戏已经到了推广发布阶段了,感觉有必要整几篇日志出来,让大家更加深入的了解整个游戏的制作过程,好了废话不多说,入正题。
问题的起因是这样的,地图里有石头,有开东西的箱子,箱子有交互可以推动,掉落物可以拾取,整个游戏的物理模拟是用的Unity3D的2D物理引擎。
当遇到如下图的情况时问题就出来了。
我捡不到被箱子阻隔的掉落物了!!!!∑(゚Д゚ノ)ノ,好了本着程序解决问题原则第一条:上网查!
各种查后发现,现在市面上大部分物理引擎使用的是刚体物理,因为计算量和原理问题,软体物理的模拟技术尚未成熟,找到的仅有的几个类似效果模拟复杂且副作用大,最终放弃。
我想干脆我直接改变箱子的碰撞体大小就好了,当玩家碰撞箱子的时候,碰撞体缩小一些,还有碰撞再缩小一些,直到没有则恢复,简单暴力!抱着试试看的心理,我给箱子和掉落物写了这么个脚本
一言不合上代码
public class ColliderRadiusChange : MonoBehaviour
{
private CircleCollider2D _circleCollider2D;
private float _orignRadius;
private bool _isCollision = false;
public float _hfSpeed = 2f; //0.5秒
private void Awake()
{
LayerManager.init();
_circleCollider2D = gameObject.GetComponent<CircleCollider2D>();
_orignRadius = _circleCollider2D.radius;
}
private void Update()
{
if (_isCollision)
{
float currRadius = _circleCollider2D.radius*0.8f;
_circleCollider2D.radius = currRadius;
_circleCollider2D.offset = new Vector2(0f, currRadius);
}
else
{
if (_circleCollider2D.radius <= _orignRadius)
{
float currRadius = _circleCollider2D.radius + _orignRadius*_hfSpeed*Time.deltaTime;
if (currRadius > _orignRadius)
{
currRadius = _orignRadius;
}
_circleCollider2D.radius = currRadius;
_circleCollider2D.offset = new Vector2(0f, currRadius);
}
}
}
private void OnCollisionEnter2D(Collision2D coll)
{
//有外力並且是主角碰撞
if ((coll.gameObject.layer == ELayer.LAY_HERO || coll.gameObject.layer == ELayer.LAY_HERO_FLY) && coll.relativeVelocity.magnitude > 0f)
{
_isCollision = true;
}
}
private void OnCollisionExit2D(Collision2D coll)
{
//主角碰撞消失
if (coll.gameObject.layer == ELayer.LAY_HERO || coll.gameObject.layer == ELayer.LAY_HERO_FLY)
{
_isCollision = false;
}
}
}
好来看看效果,还算可以,毕竟问题解决了,如果有兴趣可以把显示图片也做下缩放处理,加个缓动曲线,效果应该不错。(这里把碰撞框的编辑视图弄出来,方便大家体会)
厉害了,这个操作很灵性