Files
JJBB/Assets/Project/Script/GUI/Team/TeamList.cs

219 lines
6.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using Games.GlobeDefine;
using System;
using Games.LogicObj;
using GCGame.Table;
public class TeamList : MonoBehaviour
{
private static TeamList m_Instance = null;
public static TeamList Instance()
{
return m_Instance;
}
public MemberUIInfo[] m_MemberUI;
public float changeCaptainTime = 600.0f; // N秒后自动弹出跟换队长提示
// Awake
void Awake()
{
m_Instance = this;
}
// Use this for initialization
void Start ()
{
}
void OnDestroy()
{
m_Instance = null;
}
void OnEnable()
{
ClearTeamListUI();
UpdateTeamMember();
}
//更新队员的信息
public void UpdateTeamMember()
{
//ClearTeamListUI();
//如果没有队,则清空
if (GameManager.gameManager.PlayerDataPool.TeamInfo.TeamID < 0)
{
ClearTeamListUI();
StopCountCaptainLeaveTime();
return;
}
if (null == Singleton<ObjManager>.GetInstance().MainPlayer)
{
StopCountCaptainLeaveTime();
return;
}
//同时更新自己的队长图标
if (null != PlayerFrameLogic.Instance() &&
null != Singleton<ObjManager>.GetInstance().MainPlayer)
{
//PlayerFrameLogic.Instance().SetTeamCaptain(Singleton<ObjManager>.GetInstance().MainPlayer.IsTeamLeader());
}
int index = 0;
TeamMember[] member = GameManager.gameManager.PlayerDataPool.TeamInfo.teamMember;
for (int i = 0; i < member.Length; ++i)
{
if (Singleton<ObjManager>.GetInstance().MainPlayer.IsTeamLeader(member[i].Guid))
{
captain = member[i];
}
//如果队员的GUID为非空并且和主角不一样则显示
if (member[i].Guid != GlobeVar.INVALID_GUID && member[i].Guid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
{
ShowMemberInfo(m_MemberUI[index], member[i]);
if (Singleton<ObjManager>.GetInstance().MainPlayer.IsTeamLeader(member[i].Guid))
{
TryCountCpatainLevelTime();
}
index++;
}
}
if (Singleton<ObjManager>.GetInstance().MainPlayer.IsTeamLeader())
{
StopCountCaptainLeaveTime();
}
for (int i = index; i < m_MemberUI.Length; ++i)
{
m_MemberUI[i].gameObject.SetActive(false);
}
}
//显示某一个队员的信息
void ShowMemberInfo(MemberUIInfo teamMemberUI, TeamMember memberInfo)
{
if (null == teamMemberUI)
{
return;
}
if (!teamMemberUI.gameObject.activeSelf)
teamMemberUI.gameObject.SetActive(true);
teamMemberUI.UpdateInfo(memberInfo);
}
//清空信息
public void ClearTeamListUI()
{
for (int i = 0; i < m_MemberUI.Length; ++i)
{
if (null != m_MemberUI[i])
{
m_MemberUI[i].gameObject.SetActive(false);
}
}
//foreach (MemberUIInfo teamMemberUI in m_MemberUI)
//{
// if (null != teamMemberUI)
// {
// teamMemberUI.gameObject.SetActive(false);
// }
//}
}
private Coroutine captainStopCount = null; // 队长未移动计时
private Vector2 captainPosCache = Vector2.zero; //
private float timeMark; // 开始停止移动的时间点
public TeamMember captain;
private ulong lastLeaderGuid = 0; // 上一个队长的GUID
// 尝试开始队长离开
public void TryCountCpatainLevelTime(bool isRestart = false)
{
var mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
if (mainPlayer != null && mainPlayer.IsTeamLeader(captain.Guid)
&& !mainPlayer.IsTeamLeader())
{
if(captain.Guid != lastLeaderGuid)
{
lastLeaderGuid = captain.Guid;
TryCountCpatainLevelTime(true);
return;
}
else if (isRestart == true || captainStopCount == null)
{
//放到GameManager.gameManager开启存在UI隐藏的情况会把计时暂停
if(captainStopCount != null)
{
StopCoroutine(captainStopCount);
captainStopCount = GameManager.gameManager.StartCoroutine(CountCaptainTime());
}
else
{
captainStopCount = GameManager.gameManager.StartCoroutine(CountCaptainTime());
}
}
}
else
{
if (captainStopCount != null)
{
StopCoroutine(captainStopCount);
captainStopCount = null;
}
}
}
private IEnumerator CountCaptainTime()
{
timeMark = Time.realtimeSinceStartup;
while (true)
{
if (!GameManager.gameManager.PlayerDataPool.IsHaveTeam())
{
TryCountCpatainLevelTime(true);
yield break;
}
if (Vector2.Distance(captain.ScenePos, captainPosCache) > 0.0001f)
{
captainPosCache = captain.ScenePos;
timeMark = Time.realtimeSinceStartup;
}
if (Time.realtimeSinceStartup - timeMark > TeamList.Instance().changeCaptainTime)
{
CG_REQ_OTHER_BATTLE_STATE req = (CG_REQ_OTHER_BATTLE_STATE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_OTHER_BATTLE_STATE);
req.Guid = (long)captain.Guid;
req.SendPacket();
yield break;
}
yield return null;
}
}
private void StopCountCaptainLeaveTime()
{
if(captainStopCount != null)
{
StopCoroutine(captainStopCount);
captainStopCount = null;
}
}
}