Ejemplo n.º 1
0
    /// <summary>
    /// 处理获得物品协议
    /// </summary>
    /// <param name="protocol"></param>
    public void TreateGetItemProtocol(ProtocolBytes protocol)
    {
        // 获得用户名
        string userName = protocol.GetString();

        if (userName == NetWorkManager.Instance.NowPlayerID)
        {
            return;
        }

        // 获得物品ID
        int itemId = protocol.GetInt();
        // 获得物品数量
        int itemNumber = protocol.GetInt();

        // 根据用户名获得英雄
        CharacterMono character = NetWorkManager.Instance.networkPlayers[userName].GetComponent <CharacterMono>();

        // 构造物品格子
        ItemGrid itemGrid = new ItemGrid {
            item      = TestDatabase.Instance.items[0],
            ItemCount = itemNumber
        };

        // 处理单位获得物品事件
        character.GetItem(itemGrid);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 处理Damage协议
    /// </summary>
    /// <param name="protocolBytes"></param>
    public void TreateDamageProtocol(ProtocolBytes protocolBytes)
    {
        // 获得攻击者ID
        string attackerId = protocolBytes.GetString();

        // 不处理本地玩家的伤害事件,因为本地客户端会自行处理
        if (attackerId == NowPlayerID)
        {
            return;
        }
        if (attackerId.Contains("NPC#") && IsHomeowner)
        {
            return;
        }


        CharacterMono attacker = NetWorkManager.Instance.networkPlayers[attackerId].GetComponent <CharacterMono>();
        // 获得受害者ID
        string        victimId = protocolBytes.GetString();
        CharacterMono victim   = NetWorkManager.Instance.networkPlayers[victimId].GetComponent <CharacterMono>();
        // 获得基础伤害
        int baseDamage = protocolBytes.GetInt();
        // 获得附加伤害
        int plusDamage = protocolBytes.GetInt();

        Damage damage = new Damage(baseDamage, plusDamage);

        victim.characterModel.Damaged(victim, damage, attacker);
    }
Ejemplo n.º 3
0
    public override bool IsValid()
    {
        CharacterMono characterMono = BlackBorad.CharacterMono;

        if (characterMono.prepareSkill.IsMustDesignation)
        {
            target = BlackBorad.GetCharacterMono("Enemry");
        }
        else
        {
            targetPosition = BlackBorad.GetVector3("EnemryPosition");
        }

        if ((characterMono.prepareSkill.IsMustDesignation && target == null) || characterMono == null)
        {
            return(false);
        }

        Vector3 position = target == null ? targetPosition : target.transform.position;

        if ((Input.GetKeyDown(KeyCode.Escape) || Input.GetMouseButtonDown(1)) &&
            Vector2.Distance(
                new Vector2(position.x, position.z),
                new Vector2(characterMono.transform.position.x, characterMono.transform.position.z)
                ) > characterMono.prepareSkill.SpellDistance
            )
        {
            Debug.Log("单位按下ESC键,并且两个单位相距距离超过技能释放距离");
            BlackBorad.GameObject.GetComponent <CharacterMono>().isPrepareUseSkill = false;
            return(true);
        }
        return(false);
    }
Ejemplo n.º 4
0
    // 产生特效并执行伤害
    public void Execute()
    {
        if (projectileModel.spherInfluence == 0)
        {
            // 只影响单人的投射物

            // 产生敌人身上的特效
            if (projectileModel.tartgetEnemryEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.tartgetEnemryEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            // 产生目标位置的特效
            if (projectileModel.targetPositionEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.targetPositionEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            target.characterModel.Damaged(damage);
        }
        else
        {
            // 影响一个范围的投射物

            // 产生技能特效

            // 产生目标位置的特效
            if (projectileModel.targetPositionEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.targetPositionEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            Collider[] colliders = Physics.OverlapSphere(targetPosition, projectileModel.spherInfluence);
            foreach (Collider collider in colliders)
            {
                CharacterMono targetMono = collider.GetComponent <CharacterMono>();

                if (targetMono == null)
                {
                    continue;
                }

                // 产生敌人身上的特效
                if (projectileModel.tartgetEnemryEffect != null)
                {
                    EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.tartgetEnemryEffect, during: 2f);
                    lifeCycle.transform.SetParent(target.transform);
                    lifeCycle.transform.localPosition = Vector3.zero;
                }

                targetMono.characterModel.Damaged(targetMono, damage, launcher);
            }
        }
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 在两个单位之间创建链条特效
    /// </summary>
    public void CreateChainEffect(CharacterMono speller, CharacterMono target)
    {
        EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, during: 1f, templateObject: TargetEffect);

        lifeCycle.transform.position = target.transform.position;
        lifeCycle.OnFinshied        += () => {
            CharacterMono nextTarget = null;
            // 找到目标单位周围随机的单位
            Collider[] colliders = Physics.OverlapSphere(target.transform.position, SkillInfluenceRadius);
            foreach (var collider in colliders)
            {
                CharacterMono characterMono = collider.GetComponent <CharacterMono>();
                if (characterMono != null && characterMono != target)
                {
                    nextTarget = characterMono;
                    break;
                }
            }
            if (nextTarget != null && nowCount >= 1)
            {
                Execute(speller, nextTarget);
                nowCount -= 1;
            }
            else
            {
                // 复原
                nowCount = Count;
            }
        };
    }
Ejemplo n.º 6
0
    /// <summary>
    /// 非房主产生NPC对象的方法,非房主产生的NPC无AI系统也无同步系统,其主要根据房主的NPC进行同步.
    /// </summary>
    /// <param name="id"></param>
    public void AddNetworkNpc(string id, Vector3 pos, string unitFaction)
    {
        if (!networkPlayers.ContainsKey(id))
        {
            CharacterModel characterModel = NpcPrefab.GetComponent <CharacterMono>().characterModel.DeepCopy();
            if (unitFaction == "Red")
            {
                characterModel.unitFaction = UnitFaction.Red;
            }
            else
            {
                characterModel.unitFaction = UnitFaction.Blue;
            }

            // 如果本次生成的对象不是旧对象,那么将该对象放到networkPlayers字典中去,同时给对象增加AI系统和同步系统
            CharacterMono NPC = CharacterMonoFactory.AcquireObject(characterModel, NpcPrefab, pos);

            networkPlayers[id] = NPC.gameObject;

            // 设置网络ID
            NPC.GetComponent <CharacterMono>().NetWorkPlayerID     = id;
            NPC.GetComponent <CharacterMono>().characterModel.Name = id;

            // 给产生的网络对象附加伤害同步的监听方法
            NPC.GetComponent <CharacterMono>().characterModel.OnDamaged += DamageSynchronize;
        }
    }
Ejemplo n.º 7
0
    /// <summary>
    /// 删除物品同步,监听删除物品事件
    /// </summary>
    /// <param name="characterMono"></param>
    /// <param name="itemGrid"></param>
    public void DeleteItemSynchronize(CharacterMono characterMono, ItemGrid itemGrid)
    {
        if (itemGrid.item == null)
        {
            return;
        }

        // 获得物品ID
        int itemId = itemGrid.item.ItemId;

        // 获得用户名
        string userName = NetWorkManager.Instance.NowPlayerID;

        // 构造获得物品协议
        ProtocolBytes protocolBytes = new ProtocolBytes();

        // 协议名
        protocolBytes.AddString("DeleteItem");

        // 参数
        protocolBytes.AddString(userName);
        protocolBytes.AddInt(itemId);

        // 发送协议
        NetWorkManager.Instance.Send(protocolBytes);
    }
Ejemplo n.º 8
0
 public void CancelExecute(CharacterMono speller, CharacterMono target)
 {
     if (CanBeExecuteToTarget(speller, target))
     {
         target.RemoveBattleState(additiveState.Name);
     }
 }
Ejemplo n.º 9
0
    /// <summary>
    /// 获得一个
    /// </summary>
    /// <param name="templateObjectt"></param>
    /// <param name="position"></param>
    /// <returns></returns>
    public static CharacterMono AcquireObject(CharacterModel characterModel, GameObject templateObjectt, Vector3 position)
    {
        GameObject gameObject = GameObject.Instantiate(templateObjectt);
        NavMeshHit closetsHit;

        if (NavMesh.SamplePosition(position, out closetsHit, 500, 1))
        {
            gameObject.transform.position = closetsHit.position;
            gameObject.GetComponent <NavMeshAgent>().enabled = true;
        }

        CharacterMono characterMono = gameObject.GetComponent <CharacterMono>();

        if (characterMono == null)
        {
            characterMono = gameObject.AddComponent <CharacterMono>();
        }
        // 赋值CharacterModel属性
        characterMono.characterModel = characterModel.DeepCopy();
        // 更改GameObject的名字
        characterMono.name = characterModel.Name;

        // 将新创建的单位增加到战争迷雾系统中
        FogSystem.Instace.AddFOVUnit(characterMono);

        return(characterMono);
    }
Ejemplo n.º 10
0
    /// <summary>
    /// 学习光环技能时,触发的方法
    /// </summary>
    /// <param name="speller"></param>
    public override void Execute(CharacterMono speller)
    {
        // 给单位增加光环触发器

        //==========================================
        // 新建光环触发器组件所依附的GameObject对象
        GameObject haloTrigger = new GameObject(SkillName + "HaloTrigger");

        haloTrigger.transform.SetParent(speller.transform);
        haloTrigger.transform.localPosition = Vector3.zero;

        //===============================================
        // 初始化光环触发器
        Trigger = haloTrigger.AddComponent <HaloTrigger>();

        // 设置触发器组件
        SphereCollider sphereCollider = haloTrigger.AddComponent <SphereCollider>();

        sphereCollider.isTrigger = true;
        sphereCollider.radius    = inflenceRadius;

        // 设置光环触发器的一些属性
        Trigger.TiggerRadius            = inflenceRadius;
        Trigger.SkillTargetType         = skillTargetType;
        Trigger.HaloSkillExecute       += Execute;
        Trigger.HaloSkillCancelExecute += CancelExecute;
        Trigger.gameObject.layer        = 2;
        Trigger.Speller = speller;
    }
Ejemplo n.º 11
0
    public StateConditional(CharacterMono target, BattleState battleState)
    {
        this.battleState = battleState;
        this.target      = target;

        this.target.OnRemoveBattleStatus += RemoveState;
    }
Ejemplo n.º 12
0
 public void Init()
 {
     characterMono   = BlackBorad.CharacterMono;
     EnemryTransform = BlackBorad.GetTransform("EnemryTransform");
     //enemryMono = BlackBorad.GetGameObject("Enemry").GetComponent<CharacterMono>();
     enemryMono = BlackBorad.GetCharacterMono("Enemry");
 }
Ejemplo n.º 13
0
 /// <summary>
 /// 当单位进入光环时,触发的方法
 /// </summary>
 /// <param name="speller"></param>
 /// <param name="target"></param>
 public override void Execute(CharacterMono speller, CharacterMono target)
 {
     if (CanBeExecuteToTarget(speller, target))
     {
         // 给目标附加一个持续时间为永久的中毒状态
         target.AddBattleState(additiveState.DeepCopy());
     }
 }
Ejemplo n.º 14
0
 public override void Execute(CharacterMono spller, CharacterMono target)
 {
     base.Execute(spller, target);
     target.characterModel.Damaged(target, new Damage()
     {
         BaseDamage = Damage.TotalDamage
     }, spller);
 }
Ejemplo n.º 15
0
 public override void OnAwake()
 {
     characterMono = GetComponent <CharacterMono>();
     if (characterMono.wayPointsUnit != null)
     {
         moveTargetPosition.Value = characterMono.wayPointsUnit.GetNextWayPoint();
     }
 }
Ejemplo n.º 16
0
 public override void Execute(CharacterMono speller, CharacterMono target)
 {
     if (nowCount >= 1)
     {
         CreateChainEffect(speller, target);
     }
     target.characterModel.Damaged(Damage);
 }
Ejemplo n.º 17
0
    public GameObject GetGameObjectWithPool(Vector3 position, GameObject templateObject = null)
    {
        lock (pools) {
            // 判断要获取的对象的类型在池中是否有
            // 如果要获取的对象在对象池中还有剩余
            // 返回这个剩余的对象
            for (int i = 0; i < pools.Count; i++)
            {
                PoolData p = pools[i];
                if (!p.InUse)
                {
                    // 初始化对象
                    p.Obj.transform.position = position;
                    p.Obj.SetActive(true);
                    p.InUse = true;

                    // 如果该对象是CharacterMono对象,使其状态回复
                    CharacterMono c = p.Obj.GetComponent <CharacterMono>();
                    if (c != null)
                    {
                        c.ResetCharacterModel();
                    }

                    return(p.Obj);
                }
            }

            // 如果对象池中找不到要获取的对象,或者要获取的对象全部都在使用中,
            // 那么新创建一个对象(从模板对象处进行创建)
            if (templateObject == null)
            {
                return(null);                               // 如果没有模板对象,那么返回null
            }
            GameObject obj = GameObject.Instantiate(templateObject);
            NavMeshHit closetsHit;
            if (NavMesh.SamplePosition(position, out closetsHit, 500, 1))
            {
                obj.transform.position = closetsHit.position;
                obj.GetComponent <NavMeshAgent>().enabled = true;
            }

            // 如果要创建的对象是CharacterMono,那么监听该CharacterMono的死亡事件
            // 替换掉原本CharacterMono的死亡事件,将该对象死亡时回收对象池
            CharacterMono characterMono = obj.GetComponent <CharacterMono>();
            if (characterMono != null)
            {
                characterMono.OnDiedReplacement += (CharacterMono character) => {
                    PutObject(character.gameObject);
                };
            }

            PoolData p1 = new PoolData {
                InUse = true, Obj = obj
            };
            pools.Add(p1);
            return(obj);
        }
    }
Ejemplo n.º 18
0
 /// <summary>
 /// 增加视野体
 /// </summary>
 /// <param name="characterMono"></param>
 public void AddFOVUnit(CharacterMono characterMono)
 {
     lock (LogicalLayerObjects) {
         LogicalLayerObjects.Add(characterMono);
         lock (PresentationLayerObjects){
             PresentationLayerObjects.Add(characterMono.characterModel);
         }
     }
 }
Ejemplo n.º 19
0
    // 获得当前单位与目标单位的平方距离(欧几里得距离)
    private float GetDistance(CharacterMono unit)
    {
        float x1 = unit.transform.position.x;
        float x2 = characterMono.transform.position.x;
        float z1 = unit.transform.position.z;
        float z2 = characterMono.transform.position.z;

        return((x2 - x1) * (x2 - x1) + (z2 - z1) * (z2 - z1));
    }
Ejemplo n.º 20
0
 public void Init(CharacterMono characterMono)
 {
     characterMono.OnMove          += TransformSynchronize;
     characterMono.OnPlayAnimation += AniamtionSynchronize;
     characterMono.characterModel.LevelChangedHandler += LevelSynchronize;
     characterMono.OnSpell     += SpellSkillSynchronize;
     characterMono.OnGetItem   += GetItemSynchronize;
     characterMono.OnDelteItem += DeleteItemSynchronize;
 }
Ejemplo n.º 21
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="damage"></param>
    /// <param name="attacker">袭击这个单位的人</param>
    public virtual void Damaged(CharacterMono victim, Damage damage, CharacterMono attacker)
    {
        Damaged(damage);

        if (OnDamaged != null)
        {
            OnDamaged(victim, damage, attacker, Hp);
        }
    }
Ejemplo n.º 22
0
    /// <summary>
    /// Execute方法表示应用此技能的特效,
    /// 即 施法开始-产生特效-造成伤害这一系列操作.
    /// 更准确的说,这个virtual方法使得技能类几乎可以实现所有效果,
    /// 只要后面的子技能类重写就OK了.
    /// </summary>
    /// <param name="speller">施法者</param>
    /// <param name="target">受到法术伤害的目标</param>
    public virtual void Execute(CharacterMono speller, Vector3 position)
    {
        #region 耦合,待重构
        speller.characterModel.Mp -= this.mp;
        #endregion

        finalSpellTime = Time.time;
        CreateEffect(speller, position);
    }
Ejemplo n.º 23
0
    /// <summary>
    /// Execute方法表示应用此技能的特效,
    /// 即 施法开始-产生特效-造成伤害这一系列操作.
    /// 更准确的说,这个virtual方法使得技能类几乎可以实现所有效果,
    /// 只要后面的子技能类重写就OK了.
    /// </summary>
    /// <param name="speller">施法者</param>
    /// <param name="target">受到法术伤害的目标</param>
    public virtual void Execute(CharacterMono speller, CharacterMono target)
    {
        #region 耦合,待重构
        speller.characterModel.Mp -= this.mp;
        #endregion

        finalSpellTime = Time.time;
        CreateEffect(speller, target.transform.position);
    }
Ejemplo n.º 24
0
 private void Awake()
 {
     _animator               = GetComponent <Animator>();
     _weaponMono             = GetComponent <WeaponMono>();
     _characterMono          = GetComponent <CharacterMono>();
     _capsuleCollider        = GetComponent <CapsuleCollider>();
     _rigidbody              = GetComponent <Rigidbody>();
     _thirdPersonCharacter   = GetComponent <ThirdPersonCharacter>();
     _thirdPersonUserControl = GetComponent <ThirdPersonUserControl>();
 }
Ejemplo n.º 25
0
    public override void Execute(CharacterMono speller, Vector3 position)
    {
        base.Execute(speller, position);

        //========================================
        // 为延迟技能(只能对非指向型技能)增加监听事件
        for (int i = 0; i < ActiveSkills.Count(); i++)
        {
            var skill          = ActiveSkills[i];
            var delayAttribute = SkillDelayAttributes[i];
            if (delayAttribute.isDelay && !skill.IsMustDesignation)
            {
                var activeSkill = ActiveSkills[delayAttribute.index];
                if (!activeSkill.IsMustDesignation)
                {
                    OnSkillCompeleteHandler delayExcute = null;
                    delayExcute = () => {
                        skill.Execute(speller, position);
                    };
                    activeSkill.OnCompelte += delayExcute;
                }
            }
        }



        // 首先遍历技能组,释放该技能组中的所有无需对目标单位释放的技能
        for (int i = 0; i < ActiveSkills.Count(); i++)
        {
            var skill          = ActiveSkills[i];
            var delayAttribute = SkillDelayAttributes[i];
            if (!skill.IsMustDesignation && !delayAttribute.isDelay)
            {
                skill.Execute(speller, position);
            }
        }

        // 在目标地点产生一个球形检测区域,半径由skillInflence决定,
        // 对检测区域内所有CharacterMono单位释放技能组中的单体技能
        Collider[] colliders = Physics.OverlapSphere(position, skillModel.SkillInfluenceRadius);
        foreach (var collider in colliders)
        {
            CharacterMono target = collider.GetComponent <CharacterMono>();
            if (target != null)
            {
                foreach (var skill in ActiveSkills)
                {
                    if (skill.IsMustDesignation)
                    {
                        skill.Execute(speller, target);
                    }
                }
            }
        }
    }
Ejemplo n.º 26
0
 /// <summary>
 /// 监听 准备释放技能 事件
 /// </summary>
 /// <param name="characterMono"></param>
 /// <param name="activeSkill"></param>
 private void OnPlyaerPrepareSpell(CharacterMono characterMono, ActiveSkill activeSkill)
 {
     if (characterMono.characterModel.Mp < activeSkill.Mp)
     {
         if (!isActiveAndEnabled)
         {
             Show().onComplete += Hide;
         }
         WarnningString = "当前单位Mp值不足!";
     }
 }
Ejemplo n.º 27
0
 /// <summary>
 /// 向单位固定事件进行订阅,当事件发生时,声音模块将发出声音
 /// </summary>
 public void Bind(CharacterMono target, AudioSource audioSource)
 {
     try {
         target.OnAttack += (CharacterMono Attacker, CharacterMono Suffered, Damage damage) => {
             audioSource.clip = audios[UnitAudioType.AttackAudio];
             audioSource.Play();
         };
     } catch (Exception e) {
         Debug.Log(e.Message);
     }
 }
Ejemplo n.º 28
0
    /// <summary>
    /// 遗忘光环技能时,触发的方法
    /// </summary>
    /// <param name="speller"></param>
    public void CancelExecute(CharacterMono speller)
    {
        //=========================================
        // 取消对Trigger事件的监听
        Trigger.HaloSkillExecute       -= Execute;
        Trigger.HaloSkillCancelExecute -= CancelExecute;

        //=================================
        // 摧毁光环触发器
        GameObject.Destroy(Trigger.gameObject);
    }
Ejemplo n.º 29
0
    protected virtual void OnEnter(CharacterMono stateHolder)
    {
        firsstEnterTime = Time.time;

        if (stateHolderEffect != null)
        {
            EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.BattleState, templateObject: stateHolderEffect, battleState: this, target: stateHolder);
            lifeCycle.transform.SetParent(stateHolder.transform, false);
            lifeCycle.transform.localPosition = Vector3.zero;
        }
    }
Ejemplo n.º 30
0
 public override void Execute(CharacterMono speller, CharacterMono target)
 {
     base.Execute(speller, target);
     if (AdditionalSkill.IsMustDesignation)
     {
         Execute(speller, target);
     }
     else
     {
         AdditionalSkill.Execute(speller, target.transform.position);
     }
 }