GameEntity(十一)—— Iplayer

目录为: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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值