Single-Player CCG Kit 框架研究

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();
            };
        }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值