public static void AddCollider(Unit unit, UnitData unitData, bool isSensor) { PBaseColliderHelper pBaseColliderHelper = unit.GameObject.GetComponentInChildren <PBaseColliderHelper>(); PBaseShape pBaseShape = null; switch (pBaseColliderHelper) { case PBoxColliderHelper pBoxCollider: PBoxShape pBoxShape = new PBoxShape() { eulerAnglesY = pBoxCollider.transform.eulerAngles.y, offset = pBoxCollider.offset, size = pBoxCollider.size, bodyType = pBoxCollider.bodyType, unitData = unitData, isSensor = isSensor }; pBaseShape = pBoxShape; break; case PCircleColliderHelper pCircleCollider: PCircleShape pCircleShape = new PCircleShape() { eulerAnglesY = pCircleCollider.transform.eulerAngles.y, offset = pCircleCollider.offset, radius = pCircleCollider.radius, halfHeight = pCircleCollider.height, bodyType = pCircleCollider.bodyType, unitData = unitData, isSensor = isSensor }; pBaseShape = pCircleShape; break; } var bodyCom = unit.AddComponent <P2DBodyComponent, PBaseShape>(pBaseShape); pBaseColliderHelper.bodyComponent = bodyCom; }
public void Awake(PBaseShape pShape) { baseShape = pShape; Shape shape = null; Unit unit = GetParent <Unit>(); unit.UnitData = pShape.unitData; unit.OffsetY = pShape.offset.y; switch (pShape) { case PBoxShape boxShape: //根据配置的信息,先设置Unit的一堆属性 unit.HalfHeight = boxShape.size.y / 2; //接着设置形状的数据 var box = new PolygonShape(); box.SetAsBox(boxShape.size.x, boxShape.size.z, pShape.offset.ToVector2(), BOX2DMathfUtils.ToAngle(boxShape.eulerAnglesY)); shape = box; break; case PCircleShape pCircleShape: unit.HalfHeight = pCircleShape.halfHeight; var circle = new CircleShape(); circle.Radius = pCircleShape.radius; circle.Position = pShape.offset.ToVector2(); shape = circle; break; } World world = PhysicWorldComponent.Instance.world; var bd = new BodyDef { Position = GetParent <Unit>().Position.ToVector2(), BodyType = pShape.bodyType, FixedRotation = true, }; if (bd.BodyType != BodyType.StaticBody) { bd.AllowSleep = false; } else { bd.AllowSleep = true; } body = world.CreateBody(bd); // Log.Debug(GetParent<Unit>().GameObject.name + " 在2D物理世界的位置是" + body.GetPosition()); var fd = new FixtureDef { Shape = shape, Density = 20.0f, UserData = GetParent <Unit>(), Friction = 0, IsSensor = pShape.isSensor, Filter = new Filter() { CategoryBits = (ushort)GetParent <Unit>().UnitData.unitLayer, MaskBits = (ushort)GetParent <Unit>().UnitData.layerMask, GroupIndex = (short)GetParent <Unit>().UnitData.groupIndex, } }; fixture = body.CreateFixture(fd); //Log.Debug(fixture.GetAABB(0).LowerBound.ToString() + fixture.GetAABB(0).UpperBound.ToString()); GetParent <Unit>().OnPositionUpdate += UpdatePos; GetParent <Unit>().OnRotationUpdate += UpdateRot; }