目录为:Assets/Scripts/GameEntity/目录下
Iplayer.cs
player接口
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
//继承Ientity
public class Iplayer: Ientity
{
//吸附特效
private GameObject AbsorbEffect1;
private GameObject AbsorbEffect2;
private GameObject AbsorbEffectDel1;
private GameObject AbsorbEffectDel2;
public GameObject AbsorbProgressEffect
{
get;
set;
}
//构造函数
public Iplayer(UInt64 sGUID, EntityCampType campType)
:base(sGUID, campType)
{
//GameData部分定义
//四个属性:HeadId,Level,Hp,Mp
BattleData = new PlayerBattleData ();
}
public PlayerBattleData BattleData
{
private set;
get;
}
public UInt64 GameUserId;
public string GameUserNick
{
get;
set;
}
public Ientity SyncLockTarget
{
protected set;
get;
}
public bool GameUserIsMaster
{
get;
private set;
}
public bool GameUserIsReady
{
get;
private set;
}
public uint GameUserSeat
{
get;
private set;
}
public int GameHeadId
{
get;
private set;
}
//在GameDefine处定义
//InitType = -1,
//PlayerType,
//PlayerObType,
public ObPlayerOrPlayer ObType
{
get;
private set;
}
//在GameDefine处定义
///DEUCE,
//WIN,
//LOSE,
public SITUATION StateSituation
{
get;
set;
}
//在GameDefine处定义
//eFuryNullState = 0,
//eFuryFullState,
//eFuryRunState,
public EFuryState FuryState
{
private set;
get;
}
public int FuryValue
{
private set;
get;
}
public int AccountGold
{
private set;
get;
}
public const bool MasterTag = true;
public const bool ReadyTag = true;
public const int GameLookTag = 7;
//默认为60.0f
private float mDefaultHeight = CGLCtrl_GameLogic.Instance.GetGlobalHeight ();
public void SetObjType(ObPlayerOrPlayer obType)
{
ObType = obType;
}
public override void OnEntityPrepareAttack()
{
}
//创建特效
void CreateEffect(ref GameObject Obj, string effectPath)
{
IEffect e = EffectManager.Instance.CreateNormalEffect (effectPath, RealEntity.objAttackPoint.gameObject);
if (e != null)
{
if (Obj != null)
{
GameObject.DestroyImmediate (Obj);
Obj = null;
}
Obj = e.obj;
}
}
//设置吸收特效
public void SetAbsorbEffect(int slot, bool isRemove)
{
if (isRemove == false)
{
if (slot == 0)
{
CreateEffect (ref AbsorbEffect1, "effect/other/soul_01");
}
else
{
CreateEffect (ref AbsorbEffect2, "effect/other/soul_02");
//第二个吸魂特效位置根据第一个吸魂特效位置设置相对位置
if (AbsorbEffect2 && AbsorbEffect1)
{
Vector3 rot1 = AbsorbEffect1.transform.GetChild (0).transform.localEulerAngles;
AbsorbEffect2.transform.transform.localEulerAngles = new Vector3 (rot1.x, rot1.y, rot1.z);
}
}
}
else if (isRemove == true)
{
if (slot == 0)
{
DestroyEffect (ref AbsorbEffectDel1, AbsorbEffect1, "effect/other/soul_01_delete");
}
else if (slot == 1)
{
DestroyEffect (ref AbsorbEffectDel2, AbsorbEffect2, "effect/other/soul_02_delete");
}
}
}
//灵魂销毁 特效
void DestroyEffect(ref GameObject desEffect, GameObject TranObj, string delPath)
{
if (TransObj != null)
{
if (desEffect != null)
{
desEffect.transform.parent = null;
GameObject.DestroyImmediate (desEffect);
}
Iplayer player = PlayerManager.Instance.LocalPlayer;
if (player == null)
{
return;
}
ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate (delPath, ResourceType.PREFAB);
GameObject obj = objUnit.Asset as GameObject;
if (obj == null)
{
Debug.LogError("Res Not Found:" + delPath);
}
desEffect = GameObject.Instantiate (obj) as GameObject;
desEffect.transform.position = TranObj.transform.position;
TranObj.transform.parent = null;
GameObject.DestroyImmediate (TranObj);
}
}
//进入Idle状态
public override void OnEnterIdle()
{
this.RealEntity.PlayerIdleAnimation ();
}
//设置锁定对象
public virtual void SetSyncLockTarget(Ientity entity)
{
if (SyncLockTarget == entity)
{
return;
}
this.DeltLockTargetXuetiao (entity);
this.SyncLockTarget = entity;
}
//处理锁定对象血条
public void DeltLockTargetXuetiao(Ientity target)
{
if (this.SyncLockTarget != null && this.SyncLockTarget.entityType == EntityType.Buiding)
{
this.SyncLockTarget.DestroyXueTiao ();
}
if (target != null && target.entityType == EntityType.Buiding)
{
target.CreateXueTiao ();
}
}
//Entity移动属性变化
public override void OnEntityMoveSpeedChange(int value)
{
base.OnEntityMoveSpeedChange (value);
HeroConfigInfo heroConfig;
if (ConfigReader.HeroXmlInfoDict.TryGetValue(NpcGUIDType, out heroConfig))
{
//按比例来改变动画速度
float speed = value / heroConfig.HeroMoveSpeed * heroConfig.n32BaseMoveSpeedScaling / 1000;
if (speed == 0)
{
return;
}
this.RealEntity.SetMoveAnimationSpd (speed);
}
}
//状态机执行Free消息
public override void OnExecuteFree()
{
if (RealEntity == null || this.entityType == EntityType.Buiding)
{
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 ();
//本地pos和服务端pos对齐
RealEntity.GetTransform ().position = m_pcGOSSI.sServerBeginPos;
}
else
{
Vector3 sSyncDir = synPos2D - realPos2D;
sSyncDir.Normalize ();
Vector3 pos = sSyncDir * 2 * Time.deltaTime + realPos2D;
//run 过去
RealEntity.PlayerRunAnimation ();
this.RealEntity.Controller.Move (sSyncDir * 2 * Time.deltaTime);
}
OnCameraUpdatePosition ();
TurnAngle ();
}
//转动朝向
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;
}
}
//状态机执行移动
public override void OnExecuteMove()
{
if (RealEntity == null || this.entityType == EntityType.Buiding)
{
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);
RealEntity.GetTransform ().position = new Vector3 (RealEntity.GetTransform().position.x, mDefaultHeight, RealEntity.GetTransform().position.z);
OnCameraUpdatePosition ();
EntityMoveCheck ();
}
//对象移动检测
protected virtual void EntityMoveCheck()
{
}
protected void OnCameraUpdatePosition()
{
if (objTransform.transform == GameMethod.GetMainCamera.arget && GameMethod.GetMainCamera != null && GameMethod.GetMainCamera.target != null && RealEntity != null)
{
//获取当前PlayState
PlayState playState = GameStateManager.Instance.GetCurState () as PlayState;
if (playState == null)
{
return;
}
if (playState.mCameraType == 1) //斜45度
{
//根据角色阵营调整相机旋转角度
Vector3 eular = GameMethod.GetMainCamera.transform.eulerAngles;
if (RealEntity.CampType == EntityCampType.CampTypeA)
{
GameMethod.GetMainCamera.transform.eulerAngles = new Vector3 (euler.x, 45.0f, 0/*euler.z*/);
}
else if (RealEntity.CampType == EntityCampType.CampTypeB)
{
GameMethod.GetMianCamera.Transform.eulerAngles = new Vector3 (euler.x, -135.0f, 0/*euler.z*/);
}
GameMethod.GetMianCamera.FixedUpdatePosition ();
}
else
{
//根据角色阵营调整相机旋转角度
Vector3 euler = GameMethod.GetMainCamera.transform.eulerAngles;
if (RealEntity.CampType == EntityCampType.CampTypeA)
{
GameMethod.GetMainCamera.transform.eulerAngles = new Vector3 (euler.x, 0.0f, 0/*euler.z*/);
}
else if (RealEntity.CampType == EntityCampType.CampTypeB)
{
GameMethod.GetMainCamera.transform.eulerAngles = new Vector3 (euler.x, -180.0f, 0/*euler.z*/);
}
}
}
}
public void SetSeatPosInfo(uint seat, bool ifMaster, bool ifReady, string userNick, int userHead, int gold)
{
GameUserSeat = seat;
GameUserIsReady = ifReady;
GameUserIsMaster = ifMaster;
GameUserNick = userNick;
GameHeadId = userHead;
AccountGold = gold;
}
//Raises the update hp event
public override void OnUpdateHp()
{
base.OnUpdateHp ();
}
public bool IsMaster()
{
if (GameUserIsMaster == MasterTag)
{
return true;
}
return false;
}
public bool isGameLookViewer()
{
if (GameUserSeat >= GameLookTag)
{
return true;
}
return false;
}
public override void OnUpdate()
{
base.OnUpdate ();
Iselfplayer playerSelf = PlayerManager.Instance.LocalPlayer;
//道理吗去执行说明是enemy player
if (playerSelf != null && playerSelf.realObject != null && !this.IsSameCamp(playerSelf.EntityCamp))
{
//self player distance with enemy player
float dis = Vector3.Distance (playerSelf.objTransform.position, objTransform.position);
if (dis > GameConstDefine.PlayerLockTargetDis)
{
return;
}
if ((this.FSM != null && this.FSM.State == BlGame.FSM.FsmState.FSM_STATE_DEAD) || (this.realObject.activeSelf == false))
{
AddOrDelEnemy (this, false);
}
else
{
if (this.realObject.active == true)
{
AddOrDelEnemy (this, true);
}
}
}
}
public static void AddOrDelEnemy(Iplayer entity, bool add)
{
CEvent eve = new CEvent (EGameEvent.eGameEvent_AddOrDelEnemy);
eve.AddParam ("Add", add);
eve.AddParam ("Target", entity);
EventCenter.SendEvent (eve);
}
public bool IsReady()
{
if (RealdyTag == GameUserIsReady)
{
return true;
}
return false;
}
//是否是同一阵营
public bool IsSameCamp(Iplayer player)
{
if ((player.GameUserSeat % 2) == (GameUserSeat % 2))
{
return true;
}
else
{
return false;
}
}
public override void InitWhenCreateModel()
{
RealEntity.SetAttackAnimationLook (true);
}
//创建shadow
public override void OnCreateShadow()
{
int id = (int)ObjTypeID;
float radius = ConfigReader.GetHeroInfo (id).HeroCollideRadious;
float range = radius / 100.0f;
ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate (GameDefine.GameConstDefine.LoadGameShadow, ResourceType.PREFAB);
GameObject obj = GameObject.Instantiate (objUnit.Asset) as GameObject;
obj.transform.parent = this.realObject.transform;
obj.transform.localScale = new Vector3 (range, 1, range);
obj.transform.localPosition = Vector3.zero;
}
//this死亡
protected override void DoEntityDead()
{
this.XueTiao.SetVisible (false);
if (this.RealEntity.Controller.enabled)
{
this.RealEntity.Controller.enabled = false;
}
}
//Do 复活
protected override void DoReborn()
{
base.DoReborn ();
if (!this.RealEntity.Controller.enabled)
{
this.RealEntity.Controller.enabled = true;
}
if (this == PlayerManager.Instance.LocalPlayer && FSM.State == BlGame.FSM.FsmState.FSM_STATE_DEAD)
{
GameMethod.GetMainCamera.target = RealEntity.mTransform;
}
BlGame.Effect.EffectManager.Instance.CreateMormalEffect("effect/other/fuhuo", RealEntity.objAttackPoint.gameObject)
ShowXueTiao();
}
public override void OnEntityLeadSkill()
{
}
public override int GetSkillIdBySkillType(SkillType type)
{
switch (type)
{
case SkillType.SKILL_TYPE1:
return ConfigReader.GetHeroInfo(NpcGUIDType).HeroSkillType1;
case SkillType.SKILL_TYPE2:
return ConfigReader.GetHeroInfo(NpcGUIDType).HeroSkillType2;
case SkillType.SKILL_TYPE3:
return ConfigReader.GetHeroInfo(NpcGUIDType).HeroSkillType3;
case SkillType.SKILL_TYPE4:
return ConfigReader.GetHeroInfo(NpcGUIDType).HeroSkillType4;
case SkillType.SKILL_TYPE5:
return ConfigReader.GetHeroInfo(NpcGUIDType).HeroSkillType5;
}
return -1;
}
protected virtual void UpdateFuryEffect()
{
if (null != this.RealEntity)
{
this.RealEntity.UpdateFuryEffect ();
}
}
protected virtual void UpdateFuryValue()
{
}
public virtual void SetFuryState(EFuryState state)
{
FuryState = state;
UpdateFuryEffect ();
}
public void SetFuryValue(int value)
{
FuryValue = value;
UpdateFuryValue ();
}
public virtual void CleanWhenGameOver()
{
}
public void SetReconnectPlayerInfo(uint seat, string nickName)
{
GameUserNick = nickName;
GameUserSeat = seat;
}
}