1.场景切换
在map和game两个scene之间承载了切换任务的是:
a.gameinfo这个脚本
这个脚本是属于创建出来就DontDestroyOnLoad的,记录了关于场景战斗的信息。
b.Transition脚本
private IEnumerator RunFade(string level, float duration, Color fadeColor)
{
var bgTex = new Texture2D(1, 1);
bgTex.SetPixel(0, 0, fadeColor);
bgTex.Apply();
overlay = new GameObject();
var image = overlay.AddComponent<Image>();
var rect = new Rect(0, 0, bgTex.width, bgTex.height);
var sprite = Sprite.Create(bgTex, rect, new Vector2(0.5f, 0.5f), 1);
image.material.mainTexture = bgTex;
image.sprite = sprite;
var newColor = image.color;
image.color = newColor;
image.canvasRenderer.SetAlpha(0.0f);
overlay.transform.localScale = new Vector3(1, 1, 1);
overlay.GetComponent<RectTransform>().sizeDelta = canvasObject.GetComponent<RectTransform>().sizeDelta;
overlay.transform.SetParent(canvasObject.transform, false);
overlay.transform.SetAsFirstSibling();
var time = 0.0f;
var halfDuration = duration / 2.0f;
while (time < halfDuration)
{
time += Time.deltaTime;
image.canvasRenderer.SetAlpha(Mathf.InverseLerp(0, 1, time / halfDuration));
yield return waitForEndOfFrame;
}
image.canvasRenderer.SetAlpha(1.0f);
yield return waitForEndOfFrame;
SceneManager.LoadScene(level);//主要是这一句,进行了切换
time = 0.0f;
while (time < halfDuration)
{
time += Time.deltaTime;
image.canvasRenderer.SetAlpha(Mathf.InverseLerp(1, 0, time / halfDuration));
yield return waitForEndOfFrame;
}
image.canvasRenderer.SetAlpha(0.0f);
yield return waitForEndOfFrame;
Destroy(canvasObject);
}
2.战斗场景加载
a.GameSystem各个system的加载
在initiallizeGame中初始化
这些system,都会自己订阅一部分游戏内事件,并调用自己,如下:
具体代码为:
以一个EndTurnButton按钮为例子,它是这样调用各个system的:
// Copyright (C) 2019-2021 gamevanilla. All rights reserved.
// This code can only be used under the standard Unity Asset Store End User License Agreement,
// a copy of which is available at http://unity3d.com/company/legal/as_terms.
using UnityEngine;
using UnityEngine.UI;
namespace CCGKit
{
/// <summary>
/// This component is associated to the end turn button. It does two things:
/// - It is automatically disabled when the button is pressed by the player.
/// - It is automatically enabled when the player's turn begins.
/// </summary>
public class EndTurnButton : MonoBehaviour
{
private Button button;
private HandPresentationSystem handPresentationSystem;
private CardWithArrowSelectionSystem cardWithArrowSelectionSystem;
private CardWithoutArrowSelectionSystem cardWithoutArrowSelectionSystem;
private void Awake()
{
button = GetComponent<Button>();
}
private void Start()
{
handPresentationSystem = FindObjectOfType<HandPresentationSystem>();
cardWithArrowSelectionSystem = FindObjectOfType<CardWithArrowSelectionSystem>();
cardWithoutArrowSelectionSystem = FindObjectOfType<CardWithoutArrowSelectionSystem>();
}
public void OnButtonPressed()
{
if (handPresentationSystem.IsAnimating())
{
return;
}
if (cardWithArrowSelectionSystem.HasSelectedCard() ||
cardWithoutArrowSelectionSystem.HasSelectedCard())
{
return;
}
button.interactable = false;
var system = GameObject.FindObjectOfType<TurnManagementSystem>();
system.EndPlayerTurn();
}
public void OnPlayerTurnBegan()
{
button.interactable = true;
}
}
}
2.GameBootstrap,这是在gamescene中管理全局的脚本
几个主要函数:
a.Start()
初始化玩家和怪物。
布置整个场景
a.a初始化玩家
private void CreatePlayer(AssetReference templateRef)
{
var handle = Addressables.LoadAssetAsync<HeroTemplate>(templateRef);
handle.Completed += op =>
{
var template = op.Result;
player = Instantiate(template.Prefab, playerPivot);
Assert.IsNotNull(player);
var hp = playerConfig.Hp;
var mana = playerConfig.Mana;
var shield = playerConfig.Shield;
hp.Value = template.Hp;
mana.Value = template.Mana;
shield.Value = 0;
manaResetSystem.SetDefaultMana(template.Mana);
if (PlayerPrefs.HasKey(saveDataPrefKey))
{
var json = PlayerPrefs.GetString(saveDataPrefKey);
var saveData = JsonUtility.FromJson<SaveData>(json);
hp.Value = saveData.Hp;
shield.Value = saveData.Shield;
playerDeck.Clear();
foreach (var id in saveData.Deck)
{
var card = template.StartingDeck.Entries.Find(x => x.Card.Id == id);
if (card == null)
{
card = template.RewardDeck.Entries.Find(x => x.Card.Id == id);
}
if (card != null)
{
playerDeck.Add(card.Card);
}
}
}
else
{
foreach (var entry in template.StartingDeck.Entries)
{
for (var i = 0; i < entry.NumCopies; i++)
{
playerDeck.Add(entry.Card);
}
}
}
var gameInfo = FindObjectOfType<GameInfo>();
if (gameInfo != null)
{
gameInfo.SaveData.Hp = hp.Value;
gameInfo.SaveData.Shield = shield.Value;
gameInfo.SaveData.Deck.Clear();
foreach (var card in playerDeck)
{
gameInfo.SaveData.Deck.Add(card.Id);
}
}
CreateHpWidget(playerConfig.HpWidget, player, hp, template.Hp, shield);
CreateStatusWidget(playerConfig.StatusWidget, player);
manaWidget.Initialize(mana);
var obj = player.GetComponent<CharacterObject>();
obj.Template = template;
obj.Character = new RuntimeCharacter
{
Hp = hp,
Shield = shield,
Mana = mana,
Status = playerConfig.Status,
MaxHp = template.Hp
};
obj.Character.Status.Value.Clear();
numAssetsLoaded++;
InitializeGame();
};
}