/// <summary>
        /// 当发生碰撞时
        /// </summary>
        /// <param name="b2SCollider">碰撞到的对象</param>
        public void OnCollideStart(Entity b2SCollider)
        {
            //技能碰撞体自身Unit的B2S_ColliderComponent
            B2S_ColliderComponent selfColliderComponent = Entity.GetComponent <B2S_ColliderComponent>();
            //碰撞到的Unit的B2S_ColliderComponent
            B2S_ColliderComponent targetColliderComponent = b2SCollider.GetComponent <B2S_ColliderComponent>();

            //自身Collider Unit所归属的Unit
            Unit selfBelongToUnit = selfColliderComponent.BelongToUnit;
            //碰撞到的Collider Unit所归属的Unit
            Unit collisionBelongToUnit = targetColliderComponent.BelongToUnit;


            //Log.Info("诺克Q技能打到了东西");
            switch (targetColliderComponent.B2S_CollisionInstance.nodeDataId)
            {
            case 10006:     //诺克:自身
                //TODO:这一步需要在结点编辑器配好支持自动升成
                if (selfBelongToUnit.GetComponent <B2S_RoleCastComponent>()
                    .GetRoleCastToTarget(collisionBelongToUnit) !=
                    RoleCast.Adverse)
                {
                    return;
                }

                //获取目标SkillCanvas
                List <NP_RuntimeTree> targetSkillCanvas = this.Entity.GetComponent <SkillCanvasManagerComponent>()
                                                          .GetSkillCanvas(Game.Scene.GetComponent <ConfigComponent>().Get <Server_SkillCanvasConfig>(10003).BelongToSkillId);

                //敌方英雄
                if (Vector3.Distance(selfBelongToUnit.Position, collisionBelongToUnit.Position) >= 2.3f)
                {
                    //Log.Info("Q技能打到了诺克,外圈,开始添加Buff");

                    foreach (var skillCanvas in targetSkillCanvas)
                    {
                        skillCanvas.GetBlackboard().Set("Darius_QOutIsHitUnit", true);
                        skillCanvas.GetBlackboard().Get <List <long> >("Darius_QOutHitUnitIds")?.Add(collisionBelongToUnit.Id);
                    }
                }
                else
                {
                    //Log.Info("Q技能打到了诺克,内圈,开始添加Buff");

                    foreach (var skillCanvas in targetSkillCanvas)
                    {
                        skillCanvas.GetBlackboard().Set("Darius_QInnerIsHitUnit", true);
                        skillCanvas.GetBlackboard().Get <List <long> >("Darius_QInnerHitUnitIds")?.Add(collisionBelongToUnit.Id);
                    }
                }

                break;
            }
        }
        /// <summary>
        /// 广播指令和碰撞体数据(Debug用,正式上线后请使用上面那个)
        /// </summary>
        /// <param name="unit"></param>
        /// <param name="colliderComponent"></param>
        /// <param name="skillCmd"></param>
        public static void BroadcastB2S_ColliderData(Unit unit, B2S_ColliderComponent colliderComponent)
        {
            colliderComponent.SyncBody();

            //广播碰撞体信息
            foreach (var VARIABLE in colliderComponent.Body.FixtureList)
            {
                switch (VARIABLE.ShapeType)
                {
                case ShapeType.Polygon:     //多边形
                    M2C_B2S_Debugger_Polygon test = new M2C_B2S_Debugger_Polygon()
                    {
                        Id = unit.Id, SustainTime = 2000,
                    };
                    foreach (var VARIABLE1 in ((PolygonShape)VARIABLE.Shape).Vertices)
                    {
                        Vector2 worldPoint = colliderComponent.Body.GetWorldPoint(VARIABLE1);
                        test.Vects.Add(new M2C_B2S_VectorBase()
                        {
                            X = worldPoint.X, Y = worldPoint.Y
                        });
                    }

                    MessageHelper.Broadcast(test);
                    break;

                case ShapeType.Circle:     //圆形
                    CircleShape             myShape = (CircleShape)VARIABLE.Shape;
                    M2C_B2S_Debugger_Circle test1   = new M2C_B2S_Debugger_Circle()
                    {
                        Id          = unit.Id,
                        SustainTime = 2000,
                        Radius      = myShape.Radius,
                        Pos         = new M2C_B2S_VectorBase()
                        {
                            X = colliderComponent.Body.GetWorldPoint(myShape.Position).X,
                            Y = colliderComponent.Body.GetWorldPoint(myShape.Position).Y
                        },
                    };
                    MessageHelper.Broadcast(test1);
                    //Log.Info($"是圆形,并且已经朝客户端发送绘制数据,半径为{myShape.Radius}");
                    break;
                }
            }
        }
 /// <summary>
 /// 同步刚体(依据归属Unit)
 /// </summary>
 /// <param name="self"></param>
 /// <param name="pos"></param>
 public static void SyncBody(this B2S_ColliderComponent self)
 {
     self.SetColliderBodyPos(new Vector2(self.BelongToUnit.Position.x, self.BelongToUnit.Position.z));
     self.SetColliderBodyAngle(-Quaternion.QuaternionToEuler(self.BelongToUnit.Rotation).y *Settings.Pi / 180);
 }
 /// <summary>
 /// 设置刚体状态
 /// </summary>
 /// <param name="self"></param>
 /// <param name="state"></param>
 public static void SetColliderBodyState(this B2S_ColliderComponent self, bool state)
 {
     self.Body.IsEnabled = state;
 }
 /// <summary>
 /// 设置刚体角度
 /// </summary>
 /// <param name="self"></param>
 /// <param name="angle"></param>
 public static void SetColliderBodyAngle(this B2S_ColliderComponent self, float angle)
 {
     (self.Entity as Unit).Rotation = Quaternion.Euler(0, angle, 0);
     self.Body.SetTransform(self.Body.GetPosition(), angle);
 }
 /// <summary>
 /// 设置刚体位置
 /// </summary>
 /// <param name="self"></param>
 /// <param name="pos"></param>
 public static void SetColliderBodyPos(this B2S_ColliderComponent self, Vector2 pos)
 {
     (self.Entity as Unit).Position = new Vector3(pos.X, pos.Y, 0);
     self.Body.SetTransform(pos, self.Body.GetAngle());
     //Log.Info($"位置为{pos}");
 }
Exemple #7
0
        /// <summary>
        /// 创建一次一定要同步一次
        /// </summary>
        /// <param name="a">释放者unit Id</param>
        /// <param name="b">碰撞关系数据载体Id(Excel表中的)</param>
        /// <param name="c">碰撞关系数据载体中的Node的Id</param>
        /// <param name="d">目标行为树数据载体Id(Excel表中的)</param>
        public override void Run(long a, int b, long c, int d)
        {
            Unit            unit            = UnitComponent.Instance.Get(a);
            ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>();

            B2S_ColliderComponent colliderComponent = UnitFactory
                                                      .CreateColliderUnit(unit, configComponent.Get <Server_B2SCollisionRelationConfig>(b).B2S_CollisionRelationId, c)
                                                      .GetComponent <B2S_ColliderComponent>();

            //这里直接默认以英雄当前位置作为碰撞体生成的位置,如需提前指定位置,请在抛事件那里传参
            colliderComponent.SyncBody();
            //Log.Info("生成技能碰撞体");

            //根据传过来的行为树Id来给这个碰撞Unit加上行为树
            NP_RuntimeTreeFactory.CreateSkillNpRuntimeTree(colliderComponent.Entity as Unit,
                                                           configComponent.Get <Server_SkillCanvasConfig>(d).NPBehaveId, configComponent.Get <Server_SkillCanvasConfig>(d).BelongToSkillId)
            .Start();

            //下面这一部分是Debug用的,稳定后请去掉
            {
                //广播碰撞体信息
                foreach (var VARIABLE in colliderComponent.Body.FixtureList)
                {
                    switch (VARIABLE.ShapeType)
                    {
                    case ShapeType.Polygon:     //多边形
                        M2C_B2S_Debugger_Polygon test = new M2C_B2S_Debugger_Polygon()
                        {
                            Id = unit.Id, SustainTime = 2000,
                        };
                        foreach (var VARIABLE1 in ((PolygonShape)VARIABLE.Shape).Vertices)
                        {
                            Vector2 worldPoint = colliderComponent.Body.GetWorldPoint(VARIABLE1);
                            test.Vects.Add(new M2C_B2S_VectorBase()
                            {
                                X = worldPoint.X, Y = worldPoint.Y
                            });
                        }

                        MessageHelper.Broadcast(test);
                        break;

                    case ShapeType.Circle:     //圆形
                        CircleShape             myShape = (CircleShape)VARIABLE.Shape;
                        M2C_B2S_Debugger_Circle test1   = new M2C_B2S_Debugger_Circle()
                        {
                            Id          = unit.Id,
                            SustainTime = 2000,
                            Radius      = myShape.Radius,
                            Pos         = new M2C_B2S_VectorBase()
                            {
                                X = colliderComponent.Body.GetWorldPoint(myShape.Position).X,
                                Y = colliderComponent.Body.GetWorldPoint(myShape.Position).Y
                            },
                        };
                        MessageHelper.Broadcast(test1);
                        //Log.Info($"是圆形,并且已经朝客户端发送绘制数据,半径为{myShape.Radius}");
                        break;
                    }
                }
            }
        }