下面展示 玩家控制器
。
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
}
}