我创建了一个空类型物体,我要在这个物体里用代码实现另外两个物体的碰撞检测,应该怎么做?有大佬能告知一下吗?
万分感谢!
嗨。你想要获取物体的碰撞信息需要先给物体挂上碰撞回调才能获取碰撞信息,具体原理自行查询
如果你想要统一管理物体间的碰撞。那么你需要一些静态类作为辅助。并不需要所有脚本都挂在对象上。毕竟管理类并不需要跟随场景的生命周期
你可以参考我写的例子。对其进行完善即可
//碰撞事件触发
public class CollisionEvent : MonoBehaviour
{
public Action<Collision2D> onCollisionEnter;
public Action<Collision2D> onCollisionExit;
public Action<Collision2D> onCollisionStay;
private void OnCollisionEnter2D(Collision2D collision)
{
onCollisionEnter?.Invoke(collision);
}
private void OnCollisionExit2D(Collision2D collision)
{
onCollisionExit?.Invoke(collision);
}
private void OnCollisionStay2D(Collision2D collision)
{
onCollisionStay?.Invoke(collision);
}
}
//管理对象创建,删除,查询之类的操作
public class GameObjectManager
{
Action<IEvent> eventAction;
Dictionary<string, GameObject> dict = new Dictionary<string, GameObject>();
public GameObjectManager(Action<IEvent> eventAction)
{
this.eventAction = eventAction;
}
//创建对象
public GameObject Create(string prefabName)
{
//从对象池获取对象或创建对象
var go = GameObject.Instantiate(dict[prefabName]);
var collisionEvent = go.AddComponent<CollisionEvent>();
//俩对象碰撞产生碰撞事件
collisionEvent.onCollisionEnter = (collision) => eventAction?.Invoke(new GameObjectCollisionEvent(go,collision.gameObject));
return go;
}
}
public interface IEvent { }
//碰撞后产生的信息
public struct GameObjectCollisionEvent : IEvent
{
public GameObject sender { get; private set; }
public GameObject collider { get; private set; }
public GameObjectCollisionEvent(GameObject sender,GameObject collider)
{
this.sender = sender;
this.collider = collider;
}
}
//管理整个游戏
public static class Game
{
//对外派发游戏触发的事件
public static event Action<IEvent> @event;
static GameObjectManager gameObjectManager;
public static GameObjectManager GameObjectManager
{
get
{
if (gameObjectManager == null)
{
gameObjectManager = new GameObjectManager(@event);
}
return gameObjectManager;
}
}
}
//使用方式
public class Test : MonoBehaviour
{
private void Awake()
{
Game.@event += GameEvent;
}
void GameEvent(IEvent @event)
{
if(@event is GameObjectCollisionEvent collisionEvent)
{
print(collisionEvent.sender);
print(collisionEvent.collider);
}
}
}
最简单的方式,在一个物体的碰撞检测中,调用空物体上的方法即可(或者使用事件形式)
另外一种方式,可以使用两者的之间的距离来模拟碰撞。