备份CatanBuilding瘦身独立工程
This commit is contained in:
247
Assets/Scripts/GampPlay/ChallengeMatch/ChallengeMatchScene1.cs
Normal file
247
Assets/Scripts/GampPlay/ChallengeMatch/ChallengeMatchScene1.cs
Normal file
@@ -0,0 +1,247 @@
|
||||
using System.Threading.Tasks;
|
||||
using asap.core;
|
||||
using Cinemachine;
|
||||
using UniRx;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
public class ChallengeCleanStageEvent
|
||||
{
|
||||
public int stage;
|
||||
public readonly TaskCompletionSource<bool> Tcs = new ();
|
||||
}
|
||||
|
||||
public class ChallengeBrokeStepEvent
|
||||
{
|
||||
public int step;
|
||||
public float dealyTime;
|
||||
public readonly TaskCompletionSource<bool> Tcs = new();
|
||||
}
|
||||
|
||||
public class ChallengeInitStepEvent
|
||||
{
|
||||
public int step;
|
||||
}
|
||||
|
||||
public class ChallengeSetAnimationEvent
|
||||
{
|
||||
public float speed;
|
||||
public float timeForUnlocking;
|
||||
public float timeForUnLockingEnd;
|
||||
public float timeForAttacking_1;
|
||||
public float timeForAttacking_2;
|
||||
public float timeForAttackStart;
|
||||
public float timeForAttackEnd;
|
||||
public float timeForAttackEndWait;
|
||||
}
|
||||
|
||||
|
||||
public class ChallengeMatchScene1 : MonoBehaviour
|
||||
{
|
||||
|
||||
// private Transform _challengeStatic;
|
||||
// private Transform _challengeDynamic;
|
||||
private Transform _camera;
|
||||
// 想法是以后绑定一个 大奖 + 台子区域的点 到 当前的场景Node,或者直接坐在 场景Prefab 中,看看是否可实现
|
||||
// private Transform _rewardNode;
|
||||
// 管卡容器
|
||||
[SerializeField] private ChallengeBox[] boxNodeContainer;
|
||||
|
||||
|
||||
[Header("设计宽高以及分辨率")]
|
||||
|
||||
|
||||
|
||||
[SerializeField] private float designMinWidth = 1080f;
|
||||
[SerializeField] private float designMinHeight = 2160f;
|
||||
[SerializeField] private float designMaxWidth = 1080f;
|
||||
[SerializeField] private float designMaxHeight = 1920f;
|
||||
[SerializeField] private float designOrthoSize = 5f;
|
||||
|
||||
//
|
||||
private int _lastWidth;
|
||||
private int _lastHeight;
|
||||
|
||||
|
||||
// 修改平行和投影视图
|
||||
private CinemachineVirtualCamera _vCam;
|
||||
// 数据管理
|
||||
private FishingChallengeManager _fishingChallengeManager;
|
||||
//
|
||||
private CompositeDisposable _disposables = new();
|
||||
|
||||
// 当前 的Step
|
||||
private int _curStep;
|
||||
// private int _curScore;
|
||||
|
||||
public float CalcOrthographicSize()
|
||||
{
|
||||
// if (_camera == null) return;
|
||||
// 计算设计宽高比和当前宽高比
|
||||
float designMinAspect = designMinWidth/designMinHeight;
|
||||
float designMaxAspect = designMaxWidth/designMaxHeight;
|
||||
float currentAspect = Screen.width/(float)Screen.height ;
|
||||
|
||||
currentAspect = Mathf.Clamp(currentAspect, designMinAspect, designMaxAspect);
|
||||
var size = designOrthoSize * designMaxAspect/currentAspect;
|
||||
|
||||
Log($"CalcOrthographicSize ->{size}");
|
||||
return size;
|
||||
}
|
||||
|
||||
private void ApplyCameraScale()
|
||||
{
|
||||
if (Screen.width == _lastWidth && Screen.height == _lastHeight) return;
|
||||
_vCam.m_Lens.OrthographicSize = CalcOrthographicSize();
|
||||
_lastWidth = Screen.width;
|
||||
_lastHeight = Screen.height;
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// Log("Awake -> ");
|
||||
// _challengeStatic = transform.Find("challenge_static");
|
||||
// _challengeDynamic = transform.Find("challenge_dynamic");
|
||||
_camera = transform.Find("CameraRoot/Camera");
|
||||
// _rewardNode = transform.Find("RewardNode");
|
||||
|
||||
_vCam = _camera.GetComponent<CinemachineVirtualCamera>();
|
||||
// _vCam.m_Lens.Orthographic = true;
|
||||
// _vCam.m_Lens.OrthographicSize = CalcOrthographicSize(); // 设置所需大小
|
||||
_fishingChallengeManager = GContext.container.Resolve<FishingChallengeManager>();
|
||||
// 当前场景的阶段
|
||||
_curStep = _fishingChallengeManager.fishingChallengeData.step;
|
||||
// _curScore = _fishingChallengeManager.fishingChallengeData.Score;
|
||||
OnAddEvents();
|
||||
}
|
||||
#if UNITY_EDITOR
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.N))
|
||||
{
|
||||
_curStep = (_curStep + 1) % (_fishingChallengeManager.GetFullStep() + 1);
|
||||
InitCurStep();
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.V))
|
||||
{
|
||||
var e = new ChallengeCleanStageEvent
|
||||
{
|
||||
stage = 1,
|
||||
};
|
||||
OnUpdateStage(e);
|
||||
}
|
||||
ApplyCameraScale();
|
||||
}
|
||||
private void OnGMInitStep(ChallengeInitStepEvent evt)
|
||||
{
|
||||
_curStep = evt.step;
|
||||
InitCurStep();
|
||||
}
|
||||
#endif
|
||||
void OnChallengeTimeEvent(ChallengeSetAnimationEvent e)
|
||||
{
|
||||
foreach (var box in boxNodeContainer)
|
||||
{
|
||||
box.UpdateTimeController(e);
|
||||
}
|
||||
}
|
||||
private void Start()
|
||||
{
|
||||
Log("Start");
|
||||
// _vCam.Priority = 0; // 设置低优先级使其他相机接管
|
||||
// #if UNITY_EDITOR
|
||||
// EditorApplication.QueuePlayerLoopUpdate();
|
||||
// #endif
|
||||
OnSceneStart();
|
||||
}
|
||||
//
|
||||
private void OnAddEvents()
|
||||
{
|
||||
GContext.OnEvent<ChallengeCleanStageEvent>().Subscribe(OnUpdateStage).AddTo(_disposables);
|
||||
GContext.OnEvent<ChallengeBrokeStepEvent>().Subscribe(OnBrokeStep).AddTo(_disposables);
|
||||
#if UNITY_EDITOR
|
||||
GContext.OnEvent<ChallengeInitStepEvent>().Subscribe(OnGMInitStep).AddTo(_disposables);
|
||||
#endif
|
||||
GContext.OnEvent<ChallengeSetAnimationEvent>().Subscribe(OnChallengeTimeEvent).AddTo(_disposables);
|
||||
|
||||
}
|
||||
private void OnSceneStart()
|
||||
{
|
||||
InitCurStep();
|
||||
}
|
||||
private void InitCurStep()
|
||||
{
|
||||
Log($"InitCurStep -> _curStep = {_curStep}");
|
||||
var curIndex = _curStep - 1;
|
||||
var maxNum = boxNodeContainer.Length;
|
||||
for (var i = curIndex + 1; i < maxNum; ++i)
|
||||
{
|
||||
_ = boxNodeContainer[i].UpdateState(CBoxState.Locked);
|
||||
}
|
||||
if (curIndex < 0 || curIndex > boxNodeContainer.Length)
|
||||
return;
|
||||
|
||||
for (var i = 0; i <= curIndex; ++i)
|
||||
{
|
||||
_ = boxNodeContainer[i].UpdateState(CBoxState.Broken);
|
||||
}
|
||||
_ = boxNodeContainer[curIndex].UpdateState(CBoxState.UnLocked);
|
||||
}
|
||||
private async void OnUpdateStage(ChallengeCleanStageEvent upStepEvent)
|
||||
{
|
||||
// Log("UpdateCurStep()");
|
||||
var stageIndex = upStepEvent.stage - 1;
|
||||
if (stageIndex >= 0)
|
||||
{
|
||||
await boxNodeContainer[stageIndex].UpdateState(CBoxState.UnLocking);
|
||||
// await Awaiters.Seconds(0.5f);
|
||||
}
|
||||
upStepEvent.Tcs.SetResult(true);
|
||||
}
|
||||
|
||||
private async void OnBrokeStep(ChallengeBrokeStepEvent brokeEvent)
|
||||
{
|
||||
var step = brokeEvent.step - 1;
|
||||
if (step >= 0 && step < boxNodeContainer.Length)
|
||||
{
|
||||
await Awaiters.Seconds(brokeEvent.dealyTime);
|
||||
await boxNodeContainer[step].UpdateState(CBoxState.Attacking);
|
||||
}
|
||||
brokeEvent.Tcs.SetResult(true);
|
||||
}
|
||||
//
|
||||
private void OnEnable()
|
||||
{
|
||||
Log("OnEnable");
|
||||
_vCam.m_Lens.Orthographic = true;
|
||||
_vCam.m_Lens.OrthographicSize = CalcOrthographicSize();; // 设置所需大小
|
||||
|
||||
|
||||
_lastWidth = Screen.width;
|
||||
_lastHeight = Screen.height;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (_vCam)
|
||||
{
|
||||
_vCam.m_Lens.Orthographic = false;
|
||||
if (Camera.main != null)
|
||||
{
|
||||
var brain = Camera.main.GetComponent<CinemachineBrain>();
|
||||
brain?.ManualUpdate();
|
||||
}
|
||||
}
|
||||
_disposables?.Dispose();
|
||||
_disposables = null;
|
||||
}
|
||||
private void OnDestroy()
|
||||
{
|
||||
|
||||
}
|
||||
private void Log(object t)
|
||||
{
|
||||
Debug.Log($"<color=#00ff00> ChallengeMatchScene -> {t} </color>");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user