/// <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); }
//释放技能 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); } } }
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"); }
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(); }
/// <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; } }
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); }
/// <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; }
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); } } }
/// <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(); }
/// <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;//设置实体到新的方向 }
/// <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(); 小谷注释 }
//离开技能 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); } }
/// <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(); }
//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(); }
/// <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); //方向调整。 } }
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); }
//进入死亡状态 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(); //血条隐藏,角色控制器禁用 }
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); }
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); }
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(); }
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(); }
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); } }
/// <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(); //转动朝向 }
/// <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; } }
// 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(); }
// 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; } }
//完成技能后 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); } }
public override void InitWhenCreateModel() { RealEntity.SetAttackAnimationLoop(true); }
//引导技能 public virtual void OnEntityLeadSkill() { RealEntity.PlayerFreeAnimation(); }
/// <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; }