/// <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}"); }
/// <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; } } } }