Files
back_cantanBuilding/Assets/Scripts/EventPinball/PinballSceneController.cs
2026-05-26 16:15:54 +08:00

253 lines
8.8 KiB
C#

using asap.core;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace game
{
public class PinballSceneController : MonoBehaviour
{
#region
private EventPinballDataManager m_DataManager;
#endregion
#region
[Header("新手相关设置")]
[SerializeField] public SpriteRenderer FiringPin;
private void HideFiringPin(EventPinballHideFiringPinData data)
{
if (FiringPin != null)
{
if (FiringPin.gameObject.activeSelf == true)
{
FiringPin.gameObject.SetActive(false);
}
}
}
private void ShowFiringPin(EventPinballShowFiringPinData data)
{
if (FiringPin != null)
{
if (FiringPin.gameObject.activeSelf == false)
{
FiringPin.gameObject.SetActive(true);
}
}
}
#endregion
#region
public Transform IconPinball;
[Header("动画相关设置")]
[SerializeField] private Animation m_ArrowBreathAnim;
[SerializeField] private List<GameObject> m_HideArrowGameObjectList = new List<GameObject>();
public void PlayArrowBreathAnim(EventPinballPlayArrowBreathAnimData data)
{
m_ArrowBreathAnim.Play();
}
public void HideArrowGameObjectList(EventPinballStopArrowBreathAnimData data)
{
m_ArrowBreathAnim.Stop();
foreach (var item in m_HideArrowGameObjectList)
{
item.SetActive(false);
}
}
[SerializeField] private string m_LightOnAnimName;
[SerializeField] private float m_LightOnAnimTime;
[SerializeField] private Animator m_LightOnAnim;
public void PlayLightOnAnim(EventPinballPlayLightOnAnimData data)
{
m_LightOnAnim.gameObject.SetActive(true);
m_LightOnAnim.Play(m_LightOnAnimName);
this.StartCoroutine(StopLightOnAnim());
}
private IEnumerator StopLightOnAnim()
{
yield return new WaitForSeconds(m_LightOnAnimTime);
m_LightOnAnim.gameObject.SetActive(false);
//FishingPinballAct.Publish(new EventPinballRewardUpdateData()
//{
// Scores = m_DataManager.TemporaryScore
//});
//FishingPinballAct.Publish<EventPinballStopLightOnAnimData>(new EventPinballStopLightOnAnimData());
}
#endregion
#region
[SerializeField] private List<SpriteRenderer> m_EnergyArrowList = new List<SpriteRenderer>();
[SerializeField] private Color m_EnergyArrowColorBright = Color.white;
[SerializeField] private Color m_EnergyArrowColorDark = Color.black;
private float m_RestoreIntervalTime = 0.1f;
public void UpdateEnergyArrowList(EventPinballEnergyArrowData data)
{
if (data == null) return;
int count = m_EnergyArrowList.Count;
float step = 1.0f / count;
int index = (int)Mathf.Ceil(data.Energy / step);
for (int i = 0; i < count; ++i)
{
SpriteRenderer spriteRenderer = m_EnergyArrowList[i];
if (i < index)
{
spriteRenderer.color = m_EnergyArrowColorBright;
}
else
{
spriteRenderer.color = m_EnergyArrowColorDark;
}
}
}
public void RestoreEnergyArrowList(EventPinballEnergyArrowRestoreData data)
{
if (data == null) return;
this.StartCoroutine(RestoreEnergyArrowListToDark());
}
public IEnumerator RestoreEnergyArrowListToDark()
{
int count = m_EnergyArrowList.Count;
int brightIndex = -1;
for (int i = 0; i < count; i++)
{
SpriteRenderer spriteRenderer = m_EnergyArrowList[i];
if (spriteRenderer.color == m_EnergyArrowColorBright)
{
brightIndex = i;
}
}
if (brightIndex >= 0)
{
for (int i = brightIndex; i >= 0; i--)
{
yield return new WaitForSeconds(m_RestoreIntervalTime);
SpriteRenderer spriteRenderer = m_EnergyArrowList[i];
spriteRenderer.color = m_EnergyArrowColorDark;
}
}
}
#endregion
#region
[Header("奖励圆盘特效&动画相关设置")]
[SerializeField] private int m_ResponseNumber = 10; // 相应次数
public List<PinballCircularProgress> m_CircularProgressList = new List<PinballCircularProgress>();
public void UpdateBonusCircularProgress(EventPinballUpdateBonusCircularProgress data)
{
if (m_DataManager == null) return;
float progress = m_DataManager.GetBonusResponseRatio();
foreach (var item in m_CircularProgressList)
{
item.SetProgress(progress);
}
}
public List<Transform> m_CircularAnimList = new List<Transform>();
public float m_CircularAnimRotationalSpeed = -180f;
public void UpdateCircularRotationalAnim()
{
if (m_CircularAnimList.Count > 0)
{
var firstItem = m_CircularAnimList[0];
Vector3 eulerAngles = firstItem.eulerAngles;
eulerAngles += new Vector3(0f, 0f, 1f) * m_CircularAnimRotationalSpeed * Time.deltaTime;
if (eulerAngles.z > 360f)
{
eulerAngles.z -= 360f;
}
else if (eulerAngles.z < -360f)
{
eulerAngles.z += 360f;
}
foreach (var item in m_CircularAnimList)
{
item.eulerAngles = eulerAngles;
}
}
}
private bool m_IsShowCircularRotationalAnim = false;
public void ShowCircularRotationalAnim(EventPinballShowCircularRotationalAnim data)
{
foreach (var item in m_CircularProgressList)
{
item.gameObject.SetActive(false);
}
foreach (var item in m_CircularAnimList)
{
item.gameObject.SetActive(true);
item.eulerAngles = Vector3.zero;
}
m_IsShowCircularRotationalAnim = true;
}
public void HideCircularRotationalAnim(EventPinballHideCircularRotationalAnim data)
{
m_IsShowCircularRotationalAnim = false;
foreach (var item in m_CircularProgressList)
{
item.gameObject.SetActive(true);
}
foreach (var item in m_CircularAnimList)
{
item.gameObject.SetActive(false);
}
}
#endregion
#region
public void InitEvent()
{
FishingPinballAct.Subscribe<EventPinballEnergyArrowData>(UpdateEnergyArrowList);
FishingPinballAct.Subscribe<EventPinballEnergyArrowRestoreData>(RestoreEnergyArrowList);
FishingPinballAct.Subscribe<EventPinballUpdateBonusCircularProgress>(UpdateBonusCircularProgress);
FishingPinballAct.Subscribe<EventPinballPlayArrowBreathAnimData>(PlayArrowBreathAnim);
FishingPinballAct.Subscribe<EventPinballStopArrowBreathAnimData>(HideArrowGameObjectList);
FishingPinballAct.Subscribe<EventPinballPlayLightOnAnimData>(PlayLightOnAnim);
FishingPinballAct.Subscribe<EventPinballShowFiringPinData>(ShowFiringPin);
FishingPinballAct.Subscribe<EventPinballHideFiringPinData>(HideFiringPin);
FishingPinballAct.Subscribe<EventPinballShowCircularRotationalAnim>(ShowCircularRotationalAnim);
FishingPinballAct.Subscribe<EventPinballHideCircularRotationalAnim>(HideCircularRotationalAnim);
}
#endregion
#region
// Start is called before the first frame update
void Start()
{
m_DataManager = GContext.container.Resolve<EventPinballDataManager>();
m_DataManager.BonusResponseNumber = m_ResponseNumber;
InitEvent();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyUp(KeyCode.Escape))
{
// 关闭当前Act
GContext.Publish(new UnloadActToNextAct());
}
if (m_IsShowCircularRotationalAnim)
{
UpdateCircularRotationalAnim();
}
}
#endregion
}
}