예제 #1
0
    public async void ActionHandle(BuffHandlerVar buffHandlerVar)
    {
#if !SERVER
        if (Game.Scene.GetComponent <GlobalConfigComponent>().networkPlayMode)
        {
            //联网模式是服务器发消息,才执行
            return;
        }
#endif
        try
        {
            Buff_Move buff_Move = (Buff_Move)buffHandlerVar.data;
            if (!buffHandlerVar.GetBufferValue(out BufferValue_Pos bufferValue_Pos))
            {
                Log.Error("给移动的Buff提供的参数不包含目标位置!  " + buffHandlerVar.skillId);
                return;
            }
            if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits bufferValue_TargetUnits))
            {
                Log.Error("给移动的Buff提供的参数不包含移动的目标!  " + buffHandlerVar.skillId);
                return;
            }

            foreach (var v in bufferValue_TargetUnits.targets)
            {
                if (buff_Move.resetDir)
                {
                    v.Rotation = Quaternion.LookRotation(bufferValue_Pos.aimPos - v.Position, Vector3.up);
                }
                Vector3 aimPos = bufferValue_Pos.aimPos;

                //TODO: 下面的移动都不严谨, 要做位移的合法性检查

                if (buff_Move.flash || buff_Move.moveDuration == 0)
                {
                    //需要检查目标位置是否能瞬移过去,然后瞬移不过去的时候,找到最合理的一个点瞬移过去
                    //瞬移
                    v.Position = aimPos;
                }
                else
                {
                    //需要检查目标位置是否能移动过去,如果不行的话,就不位移了
                    CharacterMoveComponent characterMoveComponent = buffHandlerVar.source.GetComponent <CharacterMoveComponent>();
                    float moveSpeed = Vector3.Distance(v.Position, aimPos) / buff_Move.moveDuration;
                    await characterMoveComponent.MoveTo(aimPos, moveSpeed);
                }
            }
        }
        catch (Exception e)
        {
            Log.Error(e.ToString());
        }
    }
        public static void MoveAsync(this CharacterMoveComponent self, Move target)
        {
            // 验证移动是否有效,延迟补偿等
            // ...

            // 验证通过或不需补偿,更新targetMove,获得服务器currFrame
            self.targetMove = target;
            int key = Game.Scene.GetComponent <UnitStateMgrComponent>().currFrame;

            self.targetMove.frame = key;
            self.unit.GetComponent <UnitStateComponent>().currFrame = key;

            // 获得新的移动速度
            // ...

            // 暂时使用baseMoveSpeed,实际上要加上buff,技能,装备,坐骑能产生的速度,这是一个变化的数值
            self.MoveTo(self.baseMoveSpeed);
        }
예제 #3
0
    public static async ETVoid MoveAsync(this CharacterMoveComponent self, List <Vector3> path)
    {
        if (path.Count == 0)
        {
            return;
        }

        if (self.moveTcs != null)
        {
            self.moveTcs = null;
        }
        float speed = self.unit.GetComponent <NumericComponent>().GetAsFloat(NumericType.MoveSpeed);

        // 第一个点是unit的当前位置,所以不用发送
        for (int i = 1; i < path.Count; ++i)
        {
            Vector3 v3 = path[i];
            await self.MoveTo(v3, speed);
        }
    }