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

208 lines
7.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using asap.core;
using GameCore;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using cfg;
namespace game
{
public class EventPotionController : MonoBehaviour
{
public Camera potionCamera;
public GameObject centerPointGameObject;
public Transform centerOfTopMouth = null;
public List<Transform> operatingPointList = new List<Transform>();
public List<GameObject> fountainList = new List<GameObject>();
public List<GameObject> changingFountainEffectList = new List<GameObject>();
#region fountain
public int GetFountainLevel()
{
int index = -1;
int count = fountainList.Count;
for (int i = 0; i < count; ++i)
{
if (fountainList[i].activeSelf == true)
{
index = i;
}
}
return index + 1;
}
public void ChangeFountain(int fountainLevel, bool showEffect, float waitTime)
{
int index = fountainLevel - 1;
int count = fountainList.Count;
for (int i = 0; i < count; ++i)
{
if (i == index)
{
fountainList[i].SetActive(true);
}
else
{
fountainList[i].SetActive(false);
}
}
if (showEffect)
{
foreach (var gameObject in changingFountainEffectList)
{
gameObject.SetActive(false);
gameObject.SetActive(true);
}
}
if (waitTime > 0)
{
this.StartCoroutine(StopChangingFountainEffect(waitTime));
}
}
public IEnumerator StopChangingFountainEffect(float time)
{
yield return new WaitForSeconds(time);
foreach (var gameObject in changingFountainEffectList)
{
gameObject.SetActive(false);
}
}
#endregion
#region
//public void CloseCamera()
//{
// if (potionCamera == null) return;
// potionCamera.gameObject.SetActive(false);
//}
public void OpenCamera()
{
if (potionCamera == null) return;
potionCamera.gameObject.SetActive(true);
}
#endregion
#region
public void InitEvent()
{
FishingPotionAct.Subscribe<EventPotionCloseCameraData>(CloseCamera);
}
private void CloseCamera(EventPotionCloseCameraData data)
{
if (potionCamera == null) return;
potionCamera.gameObject.SetActive(false);
}
#endregion
#region
async void Awake()
{
CloseCamera(null);
EventPotionDataManager dataManager = GContext.container.Resolve<EventPotionDataManager>();
EventPotionStage level = dataManager.GetCurrentPotionLevel();
ChangeFountain(level.FountainLevel, false, 0);
GameObject pannelObj = await UIManager.Instance.ShowUI(dataManager.GetUIPanel());
EventPotionPanel panel = pannelObj.transform.GetComponent<EventPotionPanel>();
panel.SetEventPotionController(this);
RectTransform panelRectTransform = pannelObj.transform.GetComponent<RectTransform>();
float screenHeight = panelRectTransform.rect.height - panelRectTransform.sizeDelta.y;
RectTransform rawImageRectTransform = panel.ScenePotionRawImage.transform.GetComponent<RectTransform>();
float rawImageHeight = rawImageRectTransform.rect.height;
float ratioHeight = rawImageHeight / screenHeight;
OpenCamera();
potionCamera.rect = new Rect() { x = 0f, y = 0f, width = 1.0f, height = 1.0f };
float width = Screen.width;
float height = Screen.height * ratioHeight;
potionCamera.aspect = width / height;
// 3渲2rawimage
Vector2 originUIPosition = new Vector2(panel.ScenePotionRawImage.transform.position.x, panel.ScenePotionRawImage.transform.position.y);
Vector2 pivot = panel.ScenePotionRawImage.rectTransform.pivot;
Vector2 tmpUIPosition = panel.ScenePotionRawImage.rectTransform.anchoredPosition;
float imgWidth = panel.ScenePotionRawImage.rectTransform.rect.width;
float imgHeight = panel.ScenePotionRawImage.rectTransform.rect.height;
// --------------------------------- 场景内物体映射到UI上的位置 Begin ---------------------------------------
Vector3 screenPosition = potionCamera.WorldToScreenPoint(centerPointGameObject.transform.position);
float scaleX = screenPosition.x / Screen.width;
float scaleY = screenPosition.y / Screen.height;
float pixelX = panel.ScenePotionRawImage.rectTransform.position.x + imgWidth * (scaleX - pivot.x);
float pixelY = panel.ScenePotionRawImage.rectTransform.position.y + imgHeight * (scaleY - pivot.y);
Vector2 uiPosition = new Vector2(pixelX, pixelY);
panel.centerPointPosition = uiPosition;
// 操作点,倒水特效挂点
int count = operatingPointList.Count;
for (int i = 0; i < count; i++)
{
Transform transform = operatingPointList[i];
screenPosition = potionCamera.WorldToScreenPoint(transform.position);
scaleX = screenPosition.x / Screen.width;
scaleY = screenPosition.y / Screen.height;
pixelX = panel.ScenePotionRawImage.rectTransform.localPosition.x + imgWidth * (scaleX - pivot.x);
pixelY = panel.ScenePotionRawImage.rectTransform.localPosition.y + imgHeight * (scaleY - pivot.y);
uiPosition = new Vector2(pixelX, pixelY);
panel.operatingPointTransformList.Add(uiPosition);
}
// 圈口挂点
if (centerOfTopMouth != null)
{
screenPosition = potionCamera.WorldToScreenPoint(centerOfTopMouth.position);
scaleX = screenPosition.x / Screen.width;
scaleY = screenPosition.y / Screen.height;
pixelX = panel.ScenePotionRawImage.rectTransform.localPosition.x + imgWidth * (scaleX - pivot.x);
pixelY = panel.ScenePotionRawImage.rectTransform.localPosition.y + imgHeight * (scaleY - pivot.y);
panel.centerOfTopMouth = new Vector2(pixelX, pixelY);
}
// --------------------------------- 场景内物体映射到UI上的位置 End ---------------------------------------
int renderTextureWidth = (int)rawImageRectTransform.rect.width;
int renderTextureHeight = (int)rawImageRectTransform.rect.height;
RenderTexture renderTexture = new RenderTexture(renderTextureWidth, renderTextureHeight, 24);
potionCamera.targetTexture = renderTexture;
panel.ScenePotionRawImage.texture = renderTexture;
FishingPotionAct.IsInitControllerComplete = true;
InitEvent();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
#endregion
}
}