Unity开发 玩家控制器

下面展示 玩家控制器

using System.Collections.Generic;
using System.Collections;
using UnityEngine;
using HedgehogTeam.EasyTouch;
using MR_LBS.Common;
using ExitGames.Client.Photon;
using UnityEngine.SceneManagement;
//using Vuforia;

namespace MR_LBS.Client.Unity3D
{
    
    
    public class PlayerControl : MonoBehaviour
    {
    
    
        //登录后的位置
        public Location startPosition;
        [HideInInspector]
        public GameObject skillPrefab = null;

        [HideInInspector]
        public AudioSource alarm;
        [HideInInspector]
        public Collider playerCollider;
        Player playerMe;

        //最后一次受伤到现在的时间间隔,用于控制回血
        float lastHurtTime;
        //long nearByDistance = 50;
        GameObject swipeTrail;

        #region Lifecycle

        void Awake()
        {
    
    
            PlayerController playerCon = PlayerController.instance;
            EnemyController enemyCon = EnemyController.instance;
            playerCollider = GetComponent<Collider>();
            //swipeTrail = enemyCon.transform.Find("swipeTrail").gameObject;//--------------------------------------cl
#if Cheng
            playerMe = playerCon.PlayerMe;
#endif
            alarm = GetComponent<AudioSource>();
        }

        void OnEnable()
        {
    
    
            EasyTouch.On_Swipe += EasyTouch_On_Swipe;
            EasyTouch.On_SimpleTap += EasyTouch_On_SimpleTap;

        }
        void OnDisable()
        {
    
    
            UnsubscribeEvent();

        }

        void OnDestroy()
        {
    
    
            UnsubscribeEvent();
        }

        void UnsubscribeEvent()
        {
    
    
            EasyTouch.On_Swipe -= EasyTouch_On_Swipe;
            EasyTouch.On_SimpleTap -= EasyTouch_On_SimpleTap;

        }

#endregion

#region Explore

        public void StartExplore()
        {
    
    
            EnemyController enemyCon = EnemyController.instance;
            KnapsackController knapCon = KnapsackController.instance;
            InvokeRepeating("Explore", 2, 3);
            //InvokeRepeating("Displacement", 2, 10);
            //Debug.Log(GuideController.instance.inGuide);

            //如果还在引导,重置wave,避免中途退出产生的bug
            if (GuideController.instance.inGuide)
            {
    
    
                enemyCon.nextEnemyWaves = 1;

                //Debug.LogError("nextEnemyWaves--:  " + enemyCon.nextEnemyWaves);
            }
            else
            {
    
    
                //打开玩家碰撞体
                GetComponent<Collider>().enabled = true;
            }
            StartCoroutine(DelayStartEnemy());

            //假炸 TODO:reversion
            //            if (PlayerPrefs.GetInt("EntryCount") == 1 || UnityEngine.Random.Range(1, 11) == 5)
            //            {
    
    
            //                ParticleSystem pp = VuforiaManager.Instance.ARCameraTransform.GetComponentInChildren<ParticleSystem>();
            //                pp.Play();
            //                pp.GetComponent<AudioSource>().Play();
            //
            //                Operations.PlayerHpUpdate(PlayerMe.UserId, PlayerMe.Health - 10, HPChangeType.MineHit);
            //            }
        }

        IEnumerator DelayStartEnemy()
        {
    
    
            EnemyController enemyCon = EnemyController.instance;
            //有时这个值返回的比较慢,所以要等待一下下
            while (enemyCon.nextEnemyWaves == 0)
            {
    
    
                yield return new WaitForSeconds(0.5f);
            }
            enemyCon.StartEnemyWaves();

        }
        /// <summary>
        /// Explore mode.
        /// </summary>
        //TODO:reversion
        void Explore()
        {
    
    
            if (UnityPhotonClient.Instance.photonPeer.PeerState == PeerStateValue.Connected && playerMe.Logined)
            {
    
    
                //                Operations.NearByMine(PlayerMe.UserId, PlayerMe.Latitude, PlayerMe.Longitude, nearByDistance);
                //                Operations.NearByChest(PlayerMe.UserId, PlayerMe.Latitude, PlayerMe.Longitude, nearByDistance);
                //                Operations.NearByPlayer(PlayerMe.UserId, PlayerMe.Latitude, PlayerMe.Longitude, nearByDistance);
                if (playerMe.Health < playerMe.MaxHealth && Time.time - lastHurtTime > 5)
                {
    
    
                    playerMe.Health += 1;
                    //Operations.PlayerHpUpdate(playerMe.UserId, playerMe.Health, HPChangeType.Recover);
                }
            }
        }

        //TODO:reversion 计算玩家位移,刚进入游戏的位置,和现在的位置之间
        //void Displacement()
        //{
    
    
        //            if (startPosition != Location.zero)
        //            {
    
    
        //                double displacement;
        //                BaiduMapAPI.instance.PositionConversion(startPosition.Latitude, startPosition.Longitude, out displacement);
        //
        //                Debug.LogError("displacement" + displacement);
        //
        //                if (displacement > 100)
        //                {
    
    
        //                    Operations.RandomGenMine(PlayerMe.UserId, PlayerMe.Latitude, PlayerMe.Longitude, 100, 15);
        //                    Operations.RandomGenChest(PlayerMe.UserId, PlayerMe.Latitude, PlayerMe.Longitude, 100, 10);
        //                }
        //            }

        //}

#endregion

#region Hurt

        void OnCollisionEnter(Collision other)
        {
    
    
            if (playerMe.Health <= 0)
                return;

            if (other.gameObject.layer == LayerMask.NameToLayer("EnemySkill"))
            {
    
    
                //-1代表小怪兽没有主人
                PlayerHurtRequest(other.gameObject.GetComponentInParent<SkillSubControl>().SkillProp.Damage, -1, HPChangeType.MonsterHit);
            }

        }

        //被穿透型技能击中
        void OnTriggerEnter(Collider other)
        {
    
    
            if (playerMe.Health <= 0)
                return;

            if (other.gameObject.layer == LayerMask.NameToLayer("EnemySkill"))
            {
    
    
                //-1代表小怪兽没有主人
                PlayerHurtRequest(other.GetComponentInParent<SkillSubControl>().SkillProp.Damage, -1, HPChangeType.MonsterHit);
            }
        }

        void OnParticleCollision(GameObject other)
        {
    
    
            if (playerMe.Health <= 0)
                return;

            SkillSubControl skillSub = other.GetComponentInChildren<SkillSubControl>();
            if (skillSub == null)
            {
    
    
                skillSub = other.GetComponentInParent<SkillSubControl>();
            }
            PlayerHurtRequest(skillSub.SkillProp.Damage, -1, HPChangeType.MonsterHit);

        }
        //只让技能中的一个粒子碰撞生效,不然会发生多次攻击
        //        bool collide;
        //
        //        void OnParticleCollision(GameObject other)
        //        {
    
    
        //
        //            if (collide)
        //            {
    
    
        //                return;
        //            }
        //            PlayerController playerInst = PlayerController.instance;
        //
        //            else if (other.tag == "Other Player")
        //            {
    
    
        //                //GameObject物体结构仅限于小老虎
        //                playerInst.KillOtherPlayerRequest(long.Parse(other.gameObject.transform.parent.name), other.gameObject.transform.parent.gameObject, other.GetComponent<Collider>());
        //            }
        //
        //
        //            collide = true;
        //        }


        /// <summary>
        /// Players the hurt request.
        /// </summary>
        /// <param name="damage">Damage.</param>
        /// <param name="killerId">Killer identifier. -1代表小怪兽没有主人</param>
        /// <param name="hpChangeType">Hp change type.</param>
        public void PlayerHurtRequest(int damage, long killerId, HPChangeType hpChangeType)
        {
    
    
            MainView mView = MainView.instance;
            lastHurtTime = Time.time;
            mView.playerHurtScreen.TakeDamage();

            playerMe.Health = playerMe.Health - damage;

            if (playerMe.Health <= 0)
            {
    
    
                playerMe.Health = 0;
                OnPlayerDie(20);

                //Operations.PlayerHpUpdate(playerMe.UserId, killerId, 0, hpChangeType);
            }

            mView.playerHpSlider.value = (float)playerMe.Health / playerMe.MaxHealth;


        }

        /// <summary>
        /// Player die.
        /// </summary>
        /// <param name="score">minus Score by score.</param>
        public void OnPlayerDie(long minusByScore)
        {
    
    
            PlayerController playerCon = PlayerController.instance;
            MessageController messageCon = MessageController.instance;
            BattleController battleCon = BattleController.instance;
            PetController petCon = PetController.instance;
            GuideController guideCon = GuideController.instance;
            MainView mView = MainView.instance;
            KnapsackView kView = KnapsackView.instance;
            KnapsackController knapCon = KnapsackController.instance;

            //引导中不能死
            if (guideCon.inGuide)
            {
    
    
                playerCollider.enabled = false;
                return;
            }

            lastHurtTime = Time.time;
            playerCollider.enabled = false;
            mView.playerHpSlider.value = 0;
            mView.playerHurtScreen.gameObject.SetActive(false);
            StopAllCoroutines();
            CancelInvoke();

            //EnemyController.instance.CleanEnemy();//---------------------------cl

            playerCon.CleanPlayersList();

            MineController.instance.ClearMinesLists();
            ChestController.instance.ClearChestLists();

            DetectorController.instance.ClearObjectsOnRadar();

            //kView.OnPetButtonReset();

            Camera.main.clearFlags = CameraClearFlags.SolidColor;


            //销毁其他玩家
            foreach (var item in playerCon.playerDic)
            {
    
    
                if (item.Value.PlayerBody != null)
                {
    
    
                    Destroy(item.Value.PlayerBody);
                }
                if (item.Value.PlayerNameUI != null)
                {
    
    
                    Destroy(item.Value.PlayerNameUI);
                }
            }

            //battleCon.BattleRequestBundle();
            petCon.CleanPets();


            //battleCon.StartCoroutine(battleCon.BattleResult(FightResult.Lose));
            //停止计时
            //battleCon.StopCoroutine(battleCon.countTime_cor);

        }

#endregion

#region Attack

        //Tap to attack
        void EasyTouch_On_SimpleTap(Gesture gesture)
        {
    
    
            KnapsackView kView = KnapsackView.instance;
            MainView mView = MainView.instance;
            //-----------------------------------cl
            if (SceneManager.GetActiveScene().name == "BattleScene")
                return;
            //-----------------------------------cl
            if (gesture.isOverGui || kView == null)
                return;

            GameObject tempGo = EasyTouch.GetCurrentPickedObject(0, false);
            if (tempGo)
            {
    
    
                if (tempGo.layer == LayerMask.NameToLayer("Pet") || tempGo.layer == LayerMask.NameToLayer("Enemy"))
                    return;
            }

            if (playerMe.Health > 0)
            {
    
    
                //第四波之前不能放技能啊
                if (EnemyController.instance.nextEnemyWaves <= 3 && !kView.clickSkillItUI.gameObject.activeInHierarchy)
                {
    
    
                    mView.ShowInfoText("法术 未解锁");
                    return;
                }

                //补给不需要技能就可以点击,不然没技能了也捡不了补给
                if (gesture.pickedObject != null && gesture.pickedObject.tag == "Supply")
                {
    
    
                    SupplyController.instance.PickSupplyRequest(gesture.pickedObject.transform.position, gesture.pickedObject);
                    DetectorController.instance.monsterRadar.RemoveRadarBlip(gesture.pickedObject);

                    SupplyController.instance.planetSupply.Remove(gesture.pickedObject);
                    Destroy(gesture.pickedObject);
                    return;
                }

                if (!kView.clickSkillItUI.gameObject.activeSelf)
                {
    
    
                    mView.ShowInfoText("法术 未设置");
                    //提示切换技能
                    //StartCoroutine(GuideController.instance.ShowGuideSolo(7));

                    return;
                }
                if (kView.clickSkillItUI.gameObject.activeInHierarchy && kView.clickSkillItUI.Count.text == "")
                {
    
    
                    mView.ShowInfoText("法术 已全部消耗");
                    //提示切换技能
                    //StartCoroutine(GuideController.instance.ShowGuideSolo(7));
                    return;
                }
                //旋转冷却
                //                if (KnapsackView.instance.clickSkillItUI.GetComponentInChildren<SkillButton>(true).skillProcessImage.fillAmount != 1)
                //                {
    
    
                //                    MainView.instance.ShowInfoText("法 冷却中");
                //                    return;
                //                }
                //读秒冷却
                if (kView.clickSkillItUI.GetComponentInChildren<SkillButton>(true).coldImage.enabled)
                {
    
    
                    return;
                }

                UseSkill(gesture.GetTouchToWorldPoint(3));

            }
        }


        // During the swipe
        //目前只能划走非粒子型的技能
        private void EasyTouch_On_Swipe(Gesture gesture)
        {
    
    
            //-----------------------------------cl
            if (SceneManager.GetActiveScene().name == "BattleScene")
                return;
            //-----------------------------------cl
            if (EasyTouch.GetCurrentPickedUIElement(0, false) != null && EasyTouch.GetCurrentPickedUIElement(0, false).layer == LayerMask.NameToLayer("UI"))
                return;
            // the world coordinate from touch for z=5
            Vector3 position = gesture.GetTouchToWorldPoint(5);
            //swipeTrail.transform.position = position;//--------------------------------------cl
            //划过小怪,扣血,播放特效
            GameObject go = EasyTouch.GetCurrentPickedObject(0, false);
            if (go != null && go.layer == LayerMask.NameToLayer("EnemySkill"))
            {
    
    
                SkillSubControl skillSub = go.GetComponentInChildren<SkillSubControl>();
                if (skillSub != null)
                    skillSub.traceType = TraceType.Other;
                Quaternion rotation = Quaternion.LookRotation(gesture.deltaPosition);

                go.transform.rotation = rotation;
                StartCoroutine(BeSwiped(go, gesture.deltaPosition));
            }
        }

        IEnumerator BeSwiped(GameObject go, Vector2 vector)
        {
    
    
            while (true)
            {
    
    
                yield return new WaitForFixedUpdate();
                if (go != null)
                    go.transform.position = Vector3.MoveTowards(go.transform.position, vector * 1.5f, Time.fixedDeltaTime);
            }

        }

        public void UseSkill(Vector3 pos)
        {
    
    
            KnapsackView kView = KnapsackView.instance;
            KnapsackController knapCon = KnapsackController.instance;

            if (kView.clickSkillItUI.inventoryItem == null)
                return;
            InventoryItem itItem = kView.clickSkillItUI.inventoryItem;

            Inventory inventory = itItem.Inventory;
            Transform camTran = Camera.main.transform;

            if (skillPrefab.name.Contains("Skill_1"))
            {
    
    
                GameObject skillGo = Instantiate(skillPrefab, camTran.position, camTran.rotation);
                foreach (var item in skillGo.GetComponentsInChildren<SkillSubControl>())
                {
    
    
                    Skill skill = item.SkillProp;

                    skill.Inventory = inventory;
                    skill.Damage = inventory.Damage;
                    skill.Level = inventory.Level;
                    skill.ColdTime = inventory.ColdTime;

                    skillGo.transform.LookAt(pos);
                    skillGo.transform.Rotate(0, 0, -45f);
                }
            }
            else if (skillPrefab.name.Contains("Skill_2"))
            {
    
    
                GameObject skillGo = Instantiate(skillPrefab, camTran.position, camTran.rotation);
                Skill skill = skillGo.GetComponent<SkillSubControl>().SkillProp;

                skill.Inventory = inventory;
                skill.Damage = inventory.Damage;
                skill.Level = inventory.Level;
                skill.ColdTime = inventory.ColdTime;

                skillGo.transform.LookAt(pos);
            }
            //如果当前物品只剩最后一个
            if (itItem.Count == 1)
            {
    
    
                //Debug.LogError(0);
                kView.ChangeNextHotKey(kView.clickSkillItUI);
            }
            else
            {
    
    
                string sort = inventory.Code;
                //使用就扣除
                knapCon.ReadInventoryItemInfoLocal(new List<KnapsackItemProto>{
    
    
                        new KnapsackItemProto{
    
     sort =sort, count =knapCon.inventoryDict[sort].Count-1, des = inventory.Des }
                    });
            }

            kView.clickSkillItUI.GetComponentInChildren<SkillButton>().Reset();

        }

        /// <summary>
        /// Kill Player Request.
        /// </summary>
        public void KillOtherPlayerRequest(long victimId, GameObject victim, Collider collider)
        {
    
    

            if (int.Parse(KnapsackView.instance.clickSkillItUI.Count.text) > 0)
            {
    
    

                Operations.KillPlayer(playerMe.UserId, victimId);
                collider.enabled = false;
            }
            else
            {
    
    
                MainView.instance.ShowInfoText("技能石不足,无法发动攻击");
            }
        }



#endregion

#region Revive

        /// <summary>
        /// Revive this player.
        /// </summary>
        public void ReviveRequest()
        {
    
    
            Operations.PlayerRevive(playerMe.UserId);

        }

        public void OnRevive()
        {
    
    
            GuideController guideCon = GuideController.instance;
            //SupplyController.instance.CreatSupply();
            GetComponentInChildren<Collider>().enabled = true;

            MainView.instance.ResetView();

            playerMe.Health = 200;
            //            MainView.instance.PlayerHP.text = "100";
            //MainView.instance.playerHpSlider.value = (float)playerMe.Health / playerMe.MaxHealth;

            if (guideCon.inGuide)
                StartExplore();
            else
                BaiduMapAPI.instance.StartLBSMapOnClick();
        }

#endregion

#region Camera 
        // 关闭相机
        public void OpCameraDevice(bool toggleOn)
        {
    
    
            //Debug.LogError(toggleOn);
            Material[] skyMats = PlayerController.instance.skyMats;
            Skybox skyBox = Camera.main.GetComponent<Skybox>();
            if (toggleOn)
            {
    
    
                RenderSettings.skybox = null;
                skyBox.enabled = false;
                Camera.main.clearFlags = CameraClearFlags.SolidColor;

                //----------cl
                //CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_DEFAULT);
                //CameraDevice.Instance.Start();

            }
            else
            {
    
    
                skyBox.enabled = true;

                RenderSettings.skybox = skyMats[1];
                Camera.main.clearFlags = CameraClearFlags.Skybox;

                //--------------cl
                //CameraDevice.Instance.Stop();
                //CameraDevice.Instance.Deinit();

            }

        }

#endregion
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43505432/article/details/110696455