Net_Ease_Dome/Assets/Scripts/Manage/GameManager.cs

250 lines
6.1 KiB
C#

using Invector.vCharacterController;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
#region Components
private GameObject PlayerPrefab; //player预制体
public Transform PlayerPool; //player父物体
//public Transform InitPosition; //初始位置
public Transform MySelf; //自己
public Camera MainCamera; //主相机
public Camera EnvirCamera; //环境相机
public Joystick Joystick; //虚拟轴
//public FakeMountain FakeMountain; //环境山
public CameraController CamController; //相机控制脚本
//public JiugongGridSegmentation JiugongGridSegmentation; //地形格子
public GridMange JiugongGridSegmentation; //地形格子
public vThirdPersonInput PlayerInput; //角色控制输入
public Tips Tip; //提示面板
public Font _font; //系统字体
#endregion
public List<GameObject> playerPool = new List<GameObject>();
#region Variables
public static bool GodMode = false; //上帝模式
public static bool AutoWalk = false; //自动行走
public int TagetFrameRate = 60; //设置锁帧
[Header("Target Platform Quality Settings")]
public int PcQuality = 4;
public int MobileQuality = 2;
#endregion
void Awake()
{
Instance = this;
//AutoWalk = true;
//MainCamera.enabled = false;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
Debug.unityLogger.logEnabled = Application.isEditor;
QualitySettings.SetQualityLevel(Application.isMobilePlatform ? MobileQuality : PcQuality);
}
// Use this for initialization
void Start()
{
Application.ExternalCall("OnSceneLoaded");
new FrameRate().UpdateFrame();
_font = Resources.Load<Font>("Fonts/fzzyjw");
PlayerPrefab = Resources.Load<GameObject>("Prefabs/Role/Human");
if (WebSocketDemo.instance) WebSocketDemo.instance.ConnectMain(); //连接
else MySelf = this.transform;
Application.targetFrameRate = TagetFrameRate;
}
// Update is called once per frame
void Update()
{
//#if UNITY_EDITOR
//Application.targetFrameRate = TagetFrameRate;
//#endif
}
/// <summary>
/// 更新分辨率
/// </summary>
public void UpdateResolution(string msssage)
{
if (string.IsNullOrEmpty(msssage))
{
Debug.Log("请输入参数,格式:#width#height#");
return;
}
string[] msgs = msssage.Split(msssage[0]);
if (msgs.Length < 4)
{
Debug.Log(string.Format("格式不正确,请按照该格式:#width#height#"));
return;
}
int width = Screen.width;
int.TryParse(msgs[1], out width);
int height = Screen.height;
int.TryParse(msgs[2], out height);
bool fullScreen = false;
if (msgs.Length >= 5)
bool.TryParse(msgs[3], out fullScreen);
int freshRate = 60;
if (msgs.Length >= 6)
int.TryParse(msgs[4], out freshRate);
Screen.SetResolution(width, height, fullScreen, freshRate);
Debug.Log(string.Format("w:{0} h:{1} f:{2} r:{3}", width, height, fullScreen, freshRate));
}
/// <summary>
/// 生成Player
/// </summary>
/// <param name="isme"></param>
/// <returns></returns>
public GameObject GeneratePlayers(bool isme = false, byte[] coordinate = null)
{
GameObject go = null;
if (playerPool.Count > 0)
{
go = playerPool[0];
playerPool.RemoveAt(0);
go.gameObject.SetActive(true);
InitPlayer(go, isme, coordinate);
}
else
{
if (PlayerPrefab != null)
{
go = Instantiate(PlayerPrefab);
InitPlayer(go, isme, coordinate);
}
}
return go;
}
/// <summary>
/// 回收
/// </summary>
/// <param name="player"></param>
public void RecoveryPlayers(MyPlayer player)
{
GameObject go = player.gameObject;
go.SetActive(false);
if (go.transform.Find("MyPos") != null)
go.transform.Find("MyPos").gameObject.SetActive(false);
Destroy(go.GetComponent<MyPlayer>());
playerPool.Add(go);
}
/// <summary>
/// 角色初始化
/// </summary>
/// <param name="go"></param>
/// <param name="isme"></param>
private void InitPlayer(GameObject go, bool isme, byte[] coordinate)
{
if (isme)
{
go.name = "AJ_Me";
MySelf = go.transform;
go.GetComponent<vThirdPersonInput>().Joystick = Joystick;
go.GetComponent<vThirdPersonInput>().Init();
go.AddComponent<AutoWalk>();
InitSelf();
}
else
{
go.GetComponent<Animator>().applyRootMotion = false;
Destroy(go.GetComponent<Collider>());
Destroy(go.GetComponent<Rigidbody>());
Destroy(go.GetComponent<vThirdPersonInput>());
Destroy(go.GetComponent<vThirdPersonController>());
}
if (go.transform.Find("MyPos") != null)
go.transform.Find("MyPos").gameObject.SetActive(isme);
//Vector3 temp = new Vector3(coordinate[0] * 10 + 5, 0, coordinate[1] * 10 + 5);
//temp.y = JiugongGridSegmentation.GetTerrainHeight(temp) + 0.05f;
Vector3 temp = JiugongGridSegmentation.GetGridInitPos(coordinate);
go.transform.position = temp;
go.transform.SetParent(PlayerPool);
}
/// <summary>
/// 自身初始化
/// </summary>
private void InitSelf()
{
//if(FakeMountain)FakeMountain.Target = MySelf;
JiugongGridSegmentation.PlayerTrans = MySelf;
CamController.Target = MySelf.Find("CameraTarget");
PlayerInput = MySelf.GetComponent<vThirdPersonInput>();
}
/// <summary>
/// 切换上帝模式
/// </summary>
public void God()
{
if (MySelf == null) return;
GodMode = !GodMode;
if (GodMode)
{
AutoWalk = false; //禁用
GUIManager.Instance.B_自动行走.m_Text.text = "手动行走";
}
CamController.God = PlayerInput.God = GodMode;
if (GodMode)
{
var tmps = MyPlayer.players.Keys.ToList();
tmps.ForEach(a =>
{
if (MyPlayer.players.ContainsKey(a))
{
MyPlayer.players[a].gameObject.SetActive(true);
}
});
}
//HidePlayers.ForEach(player => player.gameObject.SetActive(GodMode));
//if(FakeMountain)FakeMountain.God(GodMode); //关掉假山
MainCamera.farClipPlane = GodMode ? 800 : 150;
}
/// <summary>
/// 显示隐藏其他角色
/// </summary>
/// <param name="player"></param>
/// <param name="isnear"></param>
public void DisplayPlayer(MyPlayer player, bool isnear)
{
if (player.gameObject.activeInHierarchy != isnear)
{
if (isnear)
{
player.SyncImmediately();
}
player.gameObject.SetActive(isnear);
}
}
}