Exemplo n.º 1
0
        /// <summary>
        /// 测试用于本地无网络状态下,人物的移动,这个方法和OnEnterMove没半毛钱关系
        ///
        /// </summary>
        public void OnLocalMove()
        {
//			if (mTimeStartup == 0) {
//				mTimeStartup = Time.realtimeSinceStartup;
//			}
//			//m_pcGOSSI.sServerSyncPos = m_pcGOSSI.sServerBeginPos + m_pcGOSSI.sServerDir * fMoveDist;
//			float fThisRealTimeSinceStartup = Time.realtimeSinceStartup;
//			Debug.Log (fThisRealTimeSinceStartup);
//		//	this.objTransform.position = this.objTransform.position + EntityFSMDirection * EntityFSMMoveSpeed * fThisRealTimeSinceStartup* Time.deltaTime;
//			this.RealEntity.Controller.Move (EntityFSMDirection * EntityFSMMoveSpeed * Time.deltaTime*10);
//
//			EntityFSMPosition = this.objTransform.position;
//			mTimeStartup = fThisRealTimeSinceStartup;
            //************************************************************************************************
            Vector3 entityPos2d = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z);
            //Vector3 sSyncDir = serverPos2d - entityPos2d;
            Vector3 sSyncDir = entityPos2d;

            sSyncDir.Normalize();            //单位向量
//			float fDistToServerPos = Vector3.Distance(serverPos2d, entityPos2d);
//			if (fDistToServerPos > 5)
//			{
//
//				RealEntity.GetTransform().position = m_pcGOSSI.sServerSyncPos;
//				OnCameraUpdatePosition();
//				return;
//			}
            //Vector3 pos = entityPos2d + sSyncDir * EntityFSMMoveSpeed * Time.deltaTime;
            this.RealEntity.Controller.Move(sSyncDir * EntityFSMMoveSpeed * Time.deltaTime * 10);
            float mDefaultHeight = 60;

            RealEntity.GetTransform().position = new Vector3(RealEntity.GetTransform().position.x, mDefaultHeight, RealEntity.GetTransform().position.z);
        }
Exemplo n.º 2
0
        //释放技能
        public virtual void OnEntityReleaseSkill()
        {
            SkillManagerConfig skillManagerConfig = ConfigReader.GetSkillManagerCfg(EntitySkillID);

            if (skillManagerConfig == null)
            {
                return;
            }
            //吸附技能   实际上是配置文件中的  bIsConsumeSkill
            if (skillManagerConfig.isAbsorb == 1)
            {
                //删除已有的相同特效
                foreach (Transform child in RealEntity.objAttackPoint)
                {
                    if (child.name.Contains(skillManagerConfig.absorbRes))
                    {
                        int offset = child.name.IndexOf('_');
                        if (offset != 0)
                        {
                            string name = child.name.Substring(offset + 1);
                            int    id   = Convert.ToInt32(name);
                            EffectManager.Instance.DestroyEffect(id);
                        }
                    }
                }

                //创建吸附技能效果
                string       absortActPath     = "effect/soul_act/" + skillManagerConfig.absorbRes;
                NormalEffect absortSkillEffect = EffectManager.Instance.CreateNormalEffect(absortActPath, RealEntity.objAttackPoint.gameObject);

                if (absortSkillEffect != null)
                {
                    Quaternion rt = Quaternion.LookRotation(EntityFSMDirection);
                }
                objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
            }
            else
            {
                if (skillManagerConfig.isNormalAttack == 1) //判断是否是普通攻击
                {
                    RealEntity.PlayeAttackAnimation();      //播放攻击动画
                }
                else//技能攻击
                {
                    RealEntity.PlayerAnimation(skillManagerConfig.rAnimation);//播放释放技能动画
                    //如果此动画不是循环模式
                    if (RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation] != null && RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation].wrapMode != WrapMode.Loop)
                    {
                        RealEntity.CrossFadeSqu("free");                                      //淡入free动画
                    }
                    HolyTech.Effect.EffectManager.playSkillReleaseSound(this, EntitySkillID); //播放技能释放的声音
                }

                float distance = GetDistanceToPos(EntityFSMPosition);//有什么用?
                if (entityType != EntityType.Building)
                {
                    objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
                }
            }
        }
Exemplo n.º 3
0
    public virtual void OnFreeState()
    {
        if (RealEntity == null)
        {
            return;
        }
        if (!mHasLifeBar)
        {
            this.heroLife.SetActive(true);
            mHasLifeBar = true;
        }

        Vector2 serverPos2D = new Vector2(m_pcGOSSI.sServerBeginPos.x, m_pcGOSSI.sServerBeginPos.z);
        Vector2 objPos2D    = new Vector2(objTransform.position.x, objTransform.position.z);

        float fDistToServerPos = Vector2.Distance(serverPos2D, objPos2D);

        if (fDistToServerPos > 10)                                               //因为服务器可能对玩家的位置会有调整,所以调整位置
        {
            objTransform.position = m_pcGOSSI.sServerBeginPos;                   //按服务器的位置设置
            objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection); //方向调整。
            //RealEntity.GetComponent<Animation>().Play("free");
        }
        RealEntity.GetComponent <Animation>().Play("free");
    }
Exemplo n.º 4
0
        public override void OnExecuteEntityAdMove()
        {
            base.OnExecuteEntityAdMove();
            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
            Quaternion sMidQuater     = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 10 * Time.deltaTime);

            RealEntity.GetTransform().rotation = sMidQuater;
            this.RealEntity.PlayerRunAnimation();
        }
Exemplo n.º 5
0
        /// <summary>
        /// 转动朝向
        /// </summary>
        private void TurnAngle()
        {
            float fAngle = Vector3.Angle(RealEntity.GetTransform().forward, EntityFSMDirection);

            if (fAngle > 2)
            {
                Quaternion DestQuaternion          = Quaternion.LookRotation(EntityFSMDirection);
                Quaternion sMidQuater              = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 5 * Time.deltaTime);
                RealEntity.GetTransform().rotation = sMidQuater;
            }
        }
Exemplo n.º 6
0
 private void UpdataRange()
 {
     if (CircleArea == null)
     {
         return;
     }
     if (RealEntity == null)
     {
         return;
     }
     CircleArea.transform.localScale = new Vector3(this.AtkDis * 2.0f / RealEntity.GetTransform().localScale.x, 1.0f, this.AtkDis * 2.0f / RealEntity.GetTransform().localScale.z);
 }
Exemplo n.º 7
0
        /// <summary>
        /// Raises the entity free event.
        /// 这个方法挺恶心的,好像会同步服务器Ientity的位置
        /// </summary>
        public virtual void OnExecuteFree()
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            if (JxBlGame.Instance == null)
            {
                RealEntity.PlayerRunAnimation();
                return;
            }

            Vector2 serverPos2D = new Vector2(m_pcGOSSI.sServerBeginPos.x, m_pcGOSSI.sServerBeginPos.z);
            Vector2 objPos2D    = new Vector2(objTransform.position.x, objTransform.position.z);

            float   fDistToServerPos = Vector2.Distance(serverPos2D, objPos2D);
            Vector3 sSyncDir         = m_pcGOSSI.sServerBeginPos - objTransform.position;

            sSyncDir.y = 0;
            sSyncDir.Normalize();
            float fAngle = Vector3.Angle(objTransform.forward, sSyncDir);

            if (10 < fDistToServerPos)
            {
                objTransform.position = m_pcGOSSI.sServerBeginPos;
                objTransform.rotation = Quaternion.LookRotation(m_pcGOSSI.sServerDir);
                RealEntity.PlayerFreeAnimation();
                return;
            }
            else if (0.5f >= fDistToServerPos)
            {
                RealEntity.PlayerFreeAnimation();
                return;
            }

            RealEntity.PlayerRunAnimation();
            float fSpeed        = m_pcGOSSI.fServerSpeed;
            float fThisSyncDist = fSpeed * Time.deltaTime;

            if (fThisSyncDist > fDistToServerPos)
            {
                fThisSyncDist = fDistToServerPos;
            }
            Vector3 sNewPos = sSyncDir * fThisSyncDist + objTransform.position;

            objTransform.position = sNewPos;
            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
            Quaternion sMidQuater     = Quaternion.Lerp(objTransform.rotation, DestQuaternion, 2 * Time.deltaTime);

            objTransform.rotation = sMidQuater;
        }
Exemplo n.º 8
0
        public virtual void OnEnterSing()
        {
            SkillManagerConfig skillconfig = ConfigReader.GetSkillManagerCfg(EntitySkillID); //进那个配置文件

            RealEntity.PlayerAnimation(skillconfig.yAnimation);                              //播放回城动画

            //删除已有特效,如果没有,则跳过
            if (singEffect != null)
            {
                singEffect.transform.parent = null;
                GameObject.DestroyImmediate(singEffect);
            }
            //获取回城特效路径
            string path = GameConstDefine.LoadGameSkillEffectPath + "release/" + skillconfig.yEffect;
            //加载 backtocity 特效
            ResourceItem objUnit = ResourcesManager.Instance.loadImmediate(path, ResourceType.PREFAB);
            GameObject   obj     = objUnit.Asset as GameObject;

            if (obj == null)
            {
                return;
            }
            //创建特效
            singEffect = GameObject.Instantiate(obj) as GameObject;
            if (singEffect == null)
            {
                return;
            }

            //特效初始化
            singEffect.transform.parent        = RealEntity.objAttackPoint;
            singEffect.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
            string soundPath = GameConstDefine.LoadGameSoundPath + skillconfig.ySound;

            //音频设置
            ResourceItem soundObjUnit = ResourcesManager.Instance.loadImmediate(soundPath, ResourceType.ASSET);

            if (soundObjUnit.Asset != null)
            {
                AudioClip clip = soundObjUnit.Asset as AudioClip;
                if (clip != null)
                {
                    AudioSource Audio = AudioManager.Instance.PlayLongVoiceAudio(clip);
                    SceneSoundManager.Instance.addSound(Audio, RealEntity.gameObject);
                    singSound = Audio;
                    AudioManager.Instance.ChangeAudioVolume(Audio, 1.0f);
                }
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// 状态机执行Free消息
        /// </summary>
        public override void OnExecuteFree()
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            if (JxBlGame.Instance == null)
            {
                //RealEntity.PlayerRunAnimation ();
                GameMethod.GetMainCamera.FixedUpdatePosition();
                //statemanager == null 所以下面方法不执行的
                OnCameraUpdatePosition();
                TurnAngle();
                return;
            }
            //计算平面位置
            Vector3 synPos2D  = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z);
            Vector3 realPos2D = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z);

            float fDistToServerPos = Vector3.Distance(synPos2D, realPos2D);

            if (fDistToServerPos < 0.5f)
            {
                if (EntityStrategyHelper.IsTick(this, EntityStrategyHelper.IdleTimeTick))
                {
                    this.OnFSMStateChange(BlGame.FSM.EntityIdleFSM.Instance);
                    return;
                }
                RealEntity.PlayerFreeAnimation();
            }
            else if (fDistToServerPos > 5)
            {
                RealEntity.PlayerFreeAnimation();
                RealEntity.GetTransform().position = m_pcGOSSI.sServerBeginPos;
            }
            else
            {
                Vector3 sSyncDir = synPos2D - realPos2D;
                sSyncDir.Normalize();
                Vector3 pos = sSyncDir * 2 * Time.deltaTime + realPos2D;

                RealEntity.PlayerRunAnimation();
                this.RealEntity.Controller.Move(sSyncDir * 2 * Time.deltaTime);
            }

            OnCameraUpdatePosition();
            TurnAngle();
        }
Exemplo n.º 10
0
        /// <summary>
        /// Raises the entity free event.
        /// </summary>
        public virtual void OnExecuteFree()
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            Vector2 serverPos2D = new Vector2(m_pcGOSSI.sServerBeginPos.x, m_pcGOSSI.sServerBeginPos.z); //服务器传过来的位置
            Vector2 objPos2D    = new Vector2(objTransform.position.x, objTransform.position.z);         //实体真实位置

            float fDistToServerPos = Vector2.Distance(serverPos2D, objPos2D);                            //两者距离差值

            Vector3 sSyncDir = m_pcGOSSI.sServerBeginPos - objTransform.position;                        //获得向量(实体实际位置指向服务器传过来的位置)

            sSyncDir.y = 0;
            sSyncDir.Normalize();                                                      //向量归一化

            if (10 < fDistToServerPos)                                                 //如果距离差值大于 10,
            {
                objTransform.position = m_pcGOSSI.sServerBeginPos;                     //位置重新设定
                objTransform.rotation = Quaternion.LookRotation(m_pcGOSSI.sServerDir); //朝向设定
                RealEntity.PlayerFreeAnimation();                                      //播放自由状态的动画
                return;
            }
            else if (0.5f >= fDistToServerPos)    // 距离差值在0.5到10之间
            {
                RealEntity.PlayerFreeAnimation(); //播放自由状态的动画
                return;
            }

            //如果距离差值小于0.5 ,重新设定位置和朝向
            RealEntity.PlayerRunAnimation();                                         //播放Run动画
            float fSpeed        = m_pcGOSSI.fServerSpeed;                            //速度
            float fThisSyncDist = fSpeed * Time.deltaTime;                           //每帧的距离

            if (fThisSyncDist > fDistToServerPos)                                    //如果每一帧移动的距离大于距离差值
            {
                fThisSyncDist = fDistToServerPos;                                    //帧距则为距离差值(以最小为准的原则)
            }
            Vector3 sNewPos = sSyncDir * fThisSyncDist + objTransform.position;      //新的位置产生(原实体位置加上距离差值)

            objTransform.position = sNewPos;                                         //实体设置新位置
            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection); //朝向
            Quaternion sMidQuater     = Quaternion.Lerp(objTransform.rotation, DestQuaternion, 2 * Time.deltaTime);

            objTransform.rotation = sMidQuater;//设置实体到新的方向
        }
Exemplo n.º 11
0
        /// <summary>
        /// 状态机执行移动
        /// </summary>
        public override void OnExecuteMove()//Iplayer中
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
            Quaternion sMidQuater     = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 10 * Time.deltaTime);

            RealEntity.GetTransform().rotation = sMidQuater;                                         //实体方向旋转

            float fTimeSpan = Time.realtimeSinceStartup - m_pcGOSSI.fBeginTime;                      //时间间隔
            float fMoveDist = fTimeSpan * m_pcGOSSI.fServerSpeed;                                    //在此间隔内移动的距离

            m_pcGOSSI.sServerSyncPos = m_pcGOSSI.sServerBeginPos + m_pcGOSSI.sServerDir * fMoveDist; //新位置
            RealEntity.PlayerRunAnimation();                                                         //播放跑的动画

            //同步2D位置处理
            Vector3 serverPos2d = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z);                     //需要同步的位置,新的位置
            Vector3 entityPos2d = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z); //实体真实位置

            Vector3 sSyncDir = serverPos2d - entityPos2d;                                                                      //方向向量

            sSyncDir.Normalize();                                                                                              //向量归一化
            float fDistToServerPos = Vector3.Distance(serverPos2d, entityPos2d);                                               //距离差值

            if (fDistToServerPos > 5)                                                                                          //距离差值大5 说明速度太快,直接赋值,忽略碰撞体
            {
                RealEntity.GetTransform().position = m_pcGOSSI.sServerSyncPos;                                                 //移动到新位置上
                OnCameraUpdatePosition();                                                                                      //摄像机更新跟随
                return;
            }
            //当距离差值小于5的时候 速度说明慢,慢速的时候不能穿过碰撞体
            Vector3 pos = entityPos2d + sSyncDir * EntityFSMMoveSpeed * Time.deltaTime;//在原位置上移动一帧后的新位置

            //移动到新位置上 使用角色空控制器的Move时动力只受限制于碰撞。它将沿着碰撞器滑动,不应用于重力
            this.RealEntity.Controller.Move(sSyncDir * EntityFSMMoveSpeed * Time.deltaTime);

            //限制Y值始终在默认的高度上
            RealEntity.GetTransform().position = new Vector3(RealEntity.GetTransform().position.x, mDefaultHeight, RealEntity.GetTransform().position.z);


            OnCameraUpdatePosition();//摄像机更新
            //  EntityMoveCheck();  小谷注释
        }
Exemplo n.º 12
0
        //离开技能
        public virtual void OnEntityLeadingSkill()
        {
            SkillManagerConfig skillManagerConfig = ConfigReader.GetSkillManagerCfg(EntitySkillID);

            if (skillManagerConfig == null)
            {
                return;
            }

            RealEntity.PlayerAnimation(skillManagerConfig.rAnimation);

            float distance = GetDistanceToPos(EntityFSMPosition);//有什么用?

            if (entityType != EntityType.Building)
            {
                objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// 状态机执行移动
        /// </summary>
        public override void OnExecuteMove()
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }
            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
            Quaternion sMidQuater     = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 10 * Time.deltaTime);

            RealEntity.GetTransform().rotation = sMidQuater;
            float fTimeSpan = Time.realtimeSinceStartup - m_pcGOSSI.fBeginTime;
            float fMoveDist = fTimeSpan * m_pcGOSSI.fServerSpeed;

            m_pcGOSSI.sServerSyncPos = m_pcGOSSI.sServerBeginPos + m_pcGOSSI.sServerDir * fMoveDist;
            RealEntity.PlayerRunAnimation();

            //同步2D位置处理
            Vector3 serverPos2d = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z);
            Vector3 entityPos2d = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z);


            Vector3 sSyncDir = serverPos2d - entityPos2d;

            sSyncDir.Normalize();
            float fDistToServerPos = Vector3.Distance(serverPos2d, entityPos2d);

            if (fDistToServerPos > 5)
            {
                RealEntity.GetTransform().position = m_pcGOSSI.sServerSyncPos;
                OnCameraUpdatePosition();
                return;
            }
            Vector3 pos = entityPos2d + sSyncDir * EntityFSMMoveSpeed * Time.deltaTime;

            this.RealEntity.Controller.Move(sSyncDir * EntityFSMMoveSpeed * Time.deltaTime);

            //if (RealEntity.transform.position.y - mDefaultHeight > float.Epsilon)
            //{
            RealEntity.GetTransform().position = new Vector3(RealEntity.GetTransform().position.x, mDefaultHeight, RealEntity.GetTransform().position.z);
            //}

            OnCameraUpdatePosition();
            EntityMoveCheck();
        }
Exemplo n.º 14
0
        //public bool CheckGuideMove(Vector3 pos) {
        //    if (!SceneGuideTaskManager.Instance().CheckObstructTaskCanMove(pos)) {
        //        RealEntity.PlayerFreeAnimation();
        //        OnCameraUpdatePosition();
        //        if (FSM != null && FSM.State != FsmState.FSM_STATE_FREE)
        //            CGLCtrl_GameLogic.Instance.EmsgToss_AskStopMove();
        //        return false;
        //    }
        //    return true;
        //}

        /// <summary>
        /// 执行强制移动
        /// (好像不能Iselfplay使用,因为没有RealEntity.Collider,暂时不知道在哪里赋值)
        /// 其他对象可以用这个状态,应该是网络慢的情况下,快速移动各对象到正确位置
        /// </summary>
        public override void OnExecuteForceMove()
        {
            //base.OnExecuteForceMove();
            Quaternion DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
            Quaternion sMidQuater     = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 10 * Time.deltaTime);

            RealEntity.GetTransform().rotation = sMidQuater;
            float fTimeSpan = Time.realtimeSinceStartup - m_pcGOSSI.fBeginTime;
            float fMoveDist = fTimeSpan * m_pcGOSSI.fForceMoveSpeed;

            m_pcGOSSI.sServerSyncPos = m_pcGOSSI.sServerBeginPos + m_pcGOSSI.sServerDir * fMoveDist;
            SkillMoveConfig skillInfo = ConfigReader.GetSkillMoveConfig(EntitySkillModelId);

            if (skillInfo != null)
            {
                this.RealEntity.PlayerAnimation(skillInfo.action);
            }

            //2D位置同步
            Vector3 serverPos2D = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z);
            Vector3 realPos2D   = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z);



            Vector3 sSyncDir = serverPos2D - realPos2D;

            sSyncDir.y = 0;
            sSyncDir.Normalize();
            float fDistToServerPos = Vector3.Distance(serverPos2D, realPos2D);
            float fThisMoveSpeed   = EntityFSMMoveSpeed;

            if (fDistToServerPos > 10)
            {
                RealEntity.GetTransform().position = m_pcGOSSI.sServerBeginPos;
                GameMethod.GetMainCamera.FixedUpdatePosition();
                return;
            }
            Vector3 pos = realPos2D + EntityFSMMoveSpeed * Time.deltaTime * sSyncDir;

            //this.realObject.transform.position = pos;
            this.RealEntity.Controller.Move(sSyncDir * m_pcGOSSI.fForceMoveSpeed * Time.deltaTime);
            GameMethod.GetMainCamera.FixedUpdatePosition();
        }
Exemplo n.º 15
0
        /// <summary>
        /// 进入玩家自由状态
        /// </summary>
        public virtual void OnEnterFree()
        {
            if (RealEntity == null)
            {
                return;
            }

            Vector2 serverPos2D = new Vector2(m_pcGOSSI.sServerBeginPos.x, m_pcGOSSI.sServerBeginPos.z); //服务器传过来的位置
            Vector2 objPos2D    = new Vector2(objTransform.position.x, objTransform.position.z);         //配置文件加载的位置

            float fDistToServerPos = Vector2.Distance(serverPos2D, objPos2D);

            if (fDistToServerPos > 10)                                               //因为服务器可能对玩家的位置会有调整,所以调整位置
            {
                objTransform.position = m_pcGOSSI.sServerBeginPos;                   //按服务器的位置设置
                RealEntity.PlayerFreeAnimation();                                    //播放自由动画
                objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection); //方向调整。
            }
        }
Exemplo n.º 16
0
        public Vector3 TickMove()
        {
            float   fThisMoveSpeed = EntityFSMMoveSpeed;
            Vector3 sThisSyncDir   = EntityFSMDirection;

            if (m_pcGOSSI.fLastSyncSecond == 0)
            {
                m_pcGOSSI.fLastSyncSecond = Time.realtimeSinceStartup;
//				sThisSyncDir.z +=45;
            }
            float fSyncSecond = m_pcGOSSI.fLastSyncSecond;

            RealEntity.PlayerRunAnimation();
            Vector3 realPos2D = new Vector3(objTransform.position.x, 60, objTransform.position.z);

            //Vector3 sThisSyncDir = realPos2D;
            //Vector3 sThisSyncDir = sCrossPoint - realPos2D;
            //sThisSyncDir.y = 0;
            //sThisSyncDir = this.ConvertVector3ToDir (sThisSyncDir);//转换角度
            //不使用单位向量,摇杆幅度越大,应该速度会越快
            sThisSyncDir.Normalize();
            sThisSyncDir = Quaternion.AngleAxis(-45, Vector3.up) * sThisSyncDir;

            //float fAngle = Vector3.Angle(sThisSyncDir, m_pcGOSSI.sLocalSyncDir);
            //位置计算
            float fThisRealTimeSinceStartup = Time.realtimeSinceStartup;
            //float fThisFrameTimeSpan = fThisRealTimeSinceStartup - m_pcGOSSI.fLastSyncSecond;
            float fThisFrameTimeSpan = fThisRealTimeSinceStartup - fSyncSecond;
            float fThisSyncDist      = fThisMoveSpeed * fThisFrameTimeSpan;

            Vector3 sNewPos = sThisSyncDir * fThisSyncDist + realPos2D;

            if (sNewPos.magnitude > 0)
            {
                objTransform.position = sNewPos;
            }


            GameMethod.GetMainCamera.FixedUpdatePosition();
            m_pcGOSSI.fLastSyncSecond = fThisRealTimeSinceStartup;
            return(sThisSyncDir);
        }
Exemplo n.º 17
0
        //进入死亡状态
        public override void OnEnterDead()
        {
            VirtualStickUI.Instance.SetVirtualStickUsable(false); //禁用虚拟摇杆

            if (GameMethod.GetCameraGray != null)
            {
                GameMethod.GetCameraGray.enabled = true;                 //摄像机灰度处理
                this.StrategyTick = Time.time;                           //开始计时
            }
            this.SetSyncLockTarget(null);                                //锁定的目标清空
            RealEntity.PlayerDeadAnimation();                            //播放死亡动画

            Thanos.AudioManager.Instance.PlayEffectAudio(DeadAudioClip); //播放死亡音效
            //当英雄死了之后,就停止播放该英雄相关的所有声音
            Thanos.AudioManager.Instance.StopHeroAudio();
            //移除警告
            RemoveRuinWarning();

            this.DoEntityDead(); //血条隐藏,角色控制器禁用
        }
Exemplo n.º 18
0
    public virtual void OnEntityReleaseSkill()
    {
        SkillManagerConfig skillManagerConfig = ConfigReader.GetSkillManagerCfg(EntitySkillID);
        Animation          ani = RealEntity.GetComponent <Animation>();

        if (skillManagerConfig.isNormalAttack == 1)//判断是否是普通攻击
        {
            ani.Play("attack");
        }
        else//技能攻击
        {
            ani.Play(skillManagerConfig.rAnimation.ToString());//播放释放技能动画
            //如果此动画不是循环模式
            if (RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation] != null && RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation].wrapMode != WrapMode.Loop)
            {
                ani.CrossFadeQueued("free");//淡入free动画
            }
        }
        objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
    }
Exemplo n.º 19
0
        public override void InitWhenCreateModel()
        {
            //string path = GameConstDefine.LoadGameOtherEffectPath;
            //GameObject obj = Resources.Load(path + "guangquan_fanwei") as GameObject;

            ////root = GameObject.Instantiate (obj) as GameObject;
            //CircleAreaCollision = GameObject.Instantiate(obj) as GameObject;
            //CircleAreaCollision.transform.parent = RealEntity.transform;
            //CircleAreaCollision.transform.position = RealEntity.transform.position + new Vector3(0.0f, 0.4f, 0.0f);
            //int id = (int)CTools.GetGUIDType(GameObjGUID);
            //float radius = ConfigReader.GetHeroInfo(id).HeroCollideRadious;
            //if (radius < 100.0f)
            //{
            //    radius = 100.0f;
            //}
            //float range = radius / 100.0f;
            //CircleAreaCollision.transform.localScale = new Vector3(range * 2.0f / RealEntity.transform.localScale.x, 1.0f, range * 2.0f / RealEntity.transform.localScale.z);
            //CircleAreaCollision.transform.localRotation = Quaternion.Euler(new Vector3(0.0f, 0.0f, 0.0f));
            RealEntity.SetAttackAnimationLoop(true);
        }
Exemplo n.º 20
0
        public virtual void OnEnterFree()
        {
            if (RealEntity == null)
            {
                return;
            }
            Vector2 serverPos2D = new Vector2(m_pcGOSSI.sServerBeginPos.x, m_pcGOSSI.sServerBeginPos.z);
            Vector2 objPos2D    = new Vector2(objTransform.position.x, objTransform.position.z);

            float fDistToServerPos = Vector2.Distance(serverPos2D, objPos2D);

            if (fDistToServerPos > 10)
            {
                objTransform.position = m_pcGOSSI.sServerBeginPos;
                RealEntity.PlayerFreeAnimation();
                objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
            }

            //ShowXueTiao();
        }
Exemplo n.º 21
0
        public override void OnEnterDead()
        {
            VirtualStickUI.Instance.SetVirtualStickUsable(false);
            if (GameMethod.GetCameraGray != null)
            {
                GameMethod.GetCameraGray.enabled   = true;
                GameMethod.GetCameraGray.texFactor = 0f;
                this.StrategyTick = Time.time;
            }
            this.SetSyncLockTarget(null);
            RealEntity.PlayerDeadAnimation();
            //if(UIAvatarInfo.Instance != null){
            //    UIAvatarInfo.Instance.UpdateLockHead();
            //}

            BlGame.AudioManager.Instance.PlayEffectAudio(DeadAudioClip);
            RemoveRuinWarning();
            //當英雄死了之後,就停止播放該英雄相關的所有聲音
            BlGame.AudioManager.Instance.StopHeroAudio();
            this.DoEntityDead();
        }
Exemplo n.º 22
0
        public virtual void InitWhenCreateModel()
        {
            int id = (int)ObjTypeID;

            if (this.entityType != EntityType.Player)
            {
                RealEntity.SetAttackAnimationLoop(true);
            }
            NpcConfigInfo npcInfo = ConfigReader.GetNpcInfo(id);

            AtkSpeed = npcInfo.NpcAttackSpeed;
            if (AtkSpeed != 0)
            {
                float spd = 1 / (AtkSpeed / 1000.0f);
                RealEntity.SetAttackAnimationSpd(spd);
            }
            else
            {
                RealEntity.SetAttackAnimationSpd(1.0f);
            }
        }
Exemplo n.º 23
0
        /// <summary>
        /// 状态机执行Free消息
        /// </summary>
        public override void OnExecuteFree()  //覆盖父类的OnExecuteFree
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            //计算平面位置
            Vector3 synPos2D  = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z);                     //服务器传过来的位置
            Vector3 realPos2D = new Vector3(RealEntity.GetTransform().position.x, 60, RealEntity.GetTransform().position.z); //玩家真实位置

            float fDistToServerPos = Vector3.Distance(synPos2D, realPos2D);                                                  //距离差值

            if (fDistToServerPos < 0.5f)                                                                                     //当差值小于0.5时,
            {
                if (EntityStrategyHelper.IsTick(this, EntityStrategyHelper.IdleTimeTick))
                {
                    this.OnFSMStateChange(HolyTech.FSM.EntityIdleFSM.Instance);//进入Idle状态
                    return;
                }
                RealEntity.PlayerFreeAnimation(); //播放free动画
            }
            else if (fDistToServerPos > 5)        //当差值大于5时,
            {
                RealEntity.PlayerFreeAnimation(); //播放free动画
                RealEntity.GetTransform().position = m_pcGOSSI.sServerBeginPos;
            }
            else //当差值在0.5 到5之间
            {
                Vector3 sSyncDir = synPos2D - realPos2D;
                sSyncDir.Normalize();
                Vector3 pos = sSyncDir * 2 * Time.deltaTime + realPos2D;

                RealEntity.PlayerRunAnimation();
                this.RealEntity.Controller.Move(sSyncDir * 2 * Time.deltaTime);//在距离方向上移动过去。
            }

            OnCameraUpdatePosition(); //摄像机为直角度的更新
            TurnAngle();              //转动朝向
        }
Exemplo n.º 24
0
        /// <summary>
        /// 转动朝向
        /// </summary>
        private void TurnAngle()
        {
            float fAngle = Vector3.Angle(RealEntity.GetTransform().forward, EntityFSMDirection);

            if (fAngle > 2)
            {
                //尝试解决这个问题
                //Look rotation viewing vector is zero
                Quaternion DestQuaternion;
                if (EntityFSMDirection.x == 0 && EntityFSMDirection.y == 0 && EntityFSMDirection.z == 0)
                {
                    DestQuaternion = Quaternion.LookRotation(new Vector3(0.01f, 0, 0));
                }
                else
                {
                    DestQuaternion = Quaternion.LookRotation(EntityFSMDirection);
                }

                Quaternion sMidQuater = Quaternion.Lerp(RealEntity.GetTransform().rotation, DestQuaternion, 5 * Time.deltaTime);
                RealEntity.GetTransform().rotation = sMidQuater;
            }
        }
Exemplo n.º 25
0
        // Entity死亡
        public virtual void OnEnterDead() //实体进入死亡状态   如果是本地玩家,则执行Iselfplayer中的OnEnterDead()
        {
            //目标死亡主角相关处理
            Iselfplayer player = PlayerManager.Instance.LocalPlayer;

            if (player != null && player.SyncLockTarget != null && GameObjGUID == player.SyncLockTarget.GameObjGUID)
            {
                player.SetSyncLockTarget(null); //锁定目标为空
            }

            //播放死亡声音
            Vector3 pos = PlayerManager.Instance.LocalPlayer.RealEntity.transform.position;

            if (GetDistanceToPos(pos) <= 30)//获取某个位置的距离
            {
                this.PlayDeadSound();
            }

            //建筑物更换模型和表现特效
            if (this.entityType == EntityType.Building && this.NPCCateChild != ENPCCateChild.eNPCChild_BUILD_Base)
            {
                if (!EntityManager.GetHomeBaseList().Contains(this))
                {
                    GameMethod.SetLoadJianTaBaoZha(this);                         //爆炸特效
                    int ret = EntityManager.HandleDelectEntity(this.GameObjGUID); //删除实体
                    if (ret != 0)
                    {
                        Debug.LogError("OnEnterDead HandleDelectEntity:" + GameObjGUID + "failed");
                    }
                }
                //广播建筑销毁消息,移除警告等
                EventCenter.Broadcast <Ientity>((Int32)GameEventEnum.GameEvent_NotifyBuildingDes, this);
                return;
            }

            //非建筑物播死亡动画和清理血条寻路代理条等状态
            this.DoEntityDead();
            RealEntity.PlayerDeadAnimation();
        }
Exemplo n.º 26
0
        //
        public void initAreaCircle()
        {
            //if (SceneGuideTaskManager.Instance().IsNewsGuide() == SceneGuideTaskManager.SceneGuideType.NoGuide)
            //    return;
            if (RealEntity == null)
            {
                return;
            }

            if (CircleArea == null)
            {
                string path = GameConstDefine.LoadGameOtherEffectPath;
                //GameObject obj = Resources.Load(path + "guangquan_fanwei") as GameObject;
                ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate(path + "guangquan_fanwei", ResourceType.PREFAB);
                GameObject   obj     = objUnit.Asset as GameObject;

                if (obj == null)
                {
                    GameMethod.DebugError("CircleArea obj null");
                    return;
                }

                //root = GameObject.Instantiate (obj) as GameObject;
                CircleArea = GameObject.Instantiate(obj) as GameObject;
                CircleArea.transform.parent   = RealEntity.GetTransform();
                CircleArea.transform.position = RealEntity.GetTransform().position + new Vector3(0.0f, 0.2f, 0.0f);
                EventCenter.AddListener(EGameEvent.eGameEvent_LocalPlayerRange, UpdataRange);
                CircleArea.transform.localRotation = Quaternion.Euler(new Vector3(0.0f, 0.0f, 0.0f));
            }
            CapsuleCollider capsule = RealEntity.GetComponent <CapsuleCollider>();

            if (capsule)
            {
                capsule.enabled = false;
            }
        }
Exemplo n.º 27
0
        //完成技能后 LastingSkill
        public virtual void OnEntityLastingSkill()
        {
            SkillManagerConfig skillManagerConfig = ConfigReader.GetSkillManagerCfg(EntitySkillID);

            if (skillManagerConfig == null)
            {
                return;
            }

            RealEntity.PlayerAnimation(skillManagerConfig.rAnimation);//播放攻击动画

            ////如果此动画不是循环模式
            if (RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation] != null && RealEntity.GetComponent <Animation>()[skillManagerConfig.rAnimation].wrapMode != WrapMode.Loop)
            {
                RealEntity.CrossFadeSqu("free");//淡入free动画
            }

            float distance = GetDistanceToPos(EntityFSMPosition);//有什么用?

            if (entityType != EntityType.Building)
            {
                objTransform.rotation = Quaternion.LookRotation(EntityFSMDirection);
            }
        }
Exemplo n.º 28
0
 public override void InitWhenCreateModel()
 {
     RealEntity.SetAttackAnimationLoop(true);
 }
Exemplo n.º 29
0
 //引导技能
 public virtual void OnEntityLeadSkill()
 {
     RealEntity.PlayerFreeAnimation();
 }
Exemplo n.º 30
0
        /// <summary>
        /// Raises the entity move event.执行移动
        /// </summary>
        public virtual void OnExecuteMove()
        {
            if (RealEntity == null || this.entityType == EntityType.Building)
            {
                return;
            }

            RealEntity.PlayerRunAnimation();                                    //播放跑的动画

            float fThisRealTimeSinceStartup = Time.realtimeSinceStartup;        //以秒计,自游戏开始的实时时间
            float fTimeSpan = fThisRealTimeSinceStartup - m_pcGOSSI.fBeginTime; //时间间隔

            float fThisFrameTimeSpan = fThisRealTimeSinceStartup - m_pcGOSSI.fLastSyncSecond;

            m_pcGOSSI.fLastSyncSecond = fThisRealTimeSinceStartup;

            float fMoveDist = fTimeSpan * m_pcGOSSI.fServerSpeed;                                    //移动距离

            m_pcGOSSI.sServerSyncPos = m_pcGOSSI.sServerBeginPos + m_pcGOSSI.sServerDir * fMoveDist; //新的位置

            //2D计算
            Vector3 serverPos2D = new Vector3(m_pcGOSSI.sServerSyncPos.x, 60, m_pcGOSSI.sServerSyncPos.z); //要同步的位置,新的位置
            Vector3 realPos2D   = new Vector3(objTransform.position.x, 60, objTransform.position.z);       //实体现在的位置

            //需要同步的情况
            float fDistToSyncPos = Vector3.Distance(serverPos2D, realPos2D);// 距离差

            //大于10 的情况 直接赋值
            if (fDistToSyncPos > 10)
            {
                objTransform.position   = m_pcGOSSI.sServerSyncPos; //原位置+方向上*距离差
                objTransform.rotation   = Quaternion.LookRotation(EntityFSMDirection);
                m_pcGOSSI.sLocalSyncDir = EntityFSMDirection;
                return;
            }

            Vector3 sCrossPoint  = 5 * m_pcGOSSI.sServerDir + m_pcGOSSI.sServerSyncPos;
            Vector3 sThisSyncDir = sCrossPoint - realPos2D;

            sThisSyncDir.y = 0;
            sThisSyncDir.Normalize();


            float fAngle = Vector3.Angle(sThisSyncDir, m_pcGOSSI.sLocalSyncDir);

            if (5 < fAngle)
            {
                float   fLerpVlaue       = fAngle / 100;
                Vector3 sTempThisSyncDir = Vector3.Lerp(m_pcGOSSI.sLocalSyncDir, sThisSyncDir, fLerpVlaue);
                sThisSyncDir = sTempThisSyncDir;
            }

            float   fThisMoveSpeed = m_pcGOSSI.fServerSpeed;
            Vector3 sTempSyncDir   = m_pcGOSSI.sServerSyncPos - realPos2D;

            sTempSyncDir.y = 0;
            sTempSyncDir.Normalize();


            fAngle = Vector3.Angle(sTempSyncDir, m_pcGOSSI.sLocalSyncDir);
            if (90 < fAngle)
            {
                if (1 > fDistToSyncPos)
                {
                    fThisMoveSpeed = m_pcGOSSI.fServerSpeed;
                }
                else if (2 > fDistToSyncPos)
                {
                    fThisMoveSpeed -= m_pcGOSSI.fServerSpeed * 0.01f;
                }
                else if (5 > fDistToSyncPos)
                {
                    fThisMoveSpeed -= fThisMoveSpeed * 0.05f;
                }
                else if (6 > fDistToSyncPos)
                {
                    fThisMoveSpeed -= fThisMoveSpeed * 0.10f;
                }
                fThisMoveSpeed = m_pcGOSSI.fServerSpeed;
            }
            else
            {
                if (1 > fDistToSyncPos)
                {
                    fThisMoveSpeed = m_pcGOSSI.fServerSpeed;
                }
                else if (2 > fDistToSyncPos)
                {
                    fThisMoveSpeed += fThisMoveSpeed * 0.05f;
                }
                else if (4 > fDistToSyncPos)
                {
                    fThisMoveSpeed += fThisMoveSpeed * 0.10f;
                }
                else if (6 > fDistToSyncPos)
                {
                    fThisMoveSpeed += fThisMoveSpeed * 0.20f;
                }
                fThisMoveSpeed = m_pcGOSSI.fServerSpeed;
            }

            float fDistDiff = Mathf.Abs(fThisMoveSpeed - m_pcGOSSI.fServerSpeed);

            if (0.1 <= fDistDiff)
            {
                Debug.Log("GO " + GameObjGUID + " fThisMoveSpeed:" + fThisMoveSpeed);
            }

            //位置计算
            float   fThisSyncDist = fThisMoveSpeed * fThisFrameTimeSpan;      //距离差  移动速度*时间间隔
            Vector3 sNewPos       = sThisSyncDir * fThisSyncDist + realPos2D; //新位置     原位置+方向上*距离差

            if (sNewPos.magnitude > 0)
            {
                objTransform.position = sNewPos;  //位置设定
            }
            m_pcGOSSI.sLocalSyncDir = sThisSyncDir;
            Quaternion DestQuaternion = Quaternion.LookRotation(sThisSyncDir);
            Quaternion sMidQuater     = Quaternion.Lerp(objTransform.rotation, DestQuaternion, 3 * Time.deltaTime);

            objTransform.rotation = sMidQuater;
        }