teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

続き②のタイトルを追記

2018/04/30 12:29

投稿

imohori708
imohori708

スコア10

answer CHANGED
@@ -1,3 +1,5 @@
1
+ 続き②です。
2
+
1
3
  CardViewクラスは以下に記載します。
2
4
  ```C#
3
5
  using UnityEngine;

2

コードを見やすいように修正

2018/04/30 12:28

投稿

imohori708
imohori708

スコア10

answer CHANGED
@@ -1,1 +1,148 @@
1
+ CardViewクラスは以下に記載します。
2
+ ```C#
3
+ using UnityEngine;
4
+ using UnityEngine.Assertions;
5
+
1
- 内容重複のため削除済み
6
+ using TMPro;
7
+
8
+ using CCGKit;
9
+
10
+ /// <summary>
11
+ /// カードの描画情報
12
+ /// RuntimeCardクラスも持ってる。各スタッツ、使用可能の光とか
13
+ /// </summary>
14
+ public class CardView : MonoBehaviour
15
+ {
16
+ public RuntimeCard card { get; private set; }
17
+
18
+ //使用可能の青い光
19
+ [SerializeField]
20
+ protected SpriteRenderer glowSprite;
21
+
22
+ //イラスト
23
+ [SerializeField]
24
+ protected SpriteRenderer pictureSprite;
25
+
26
+ [SerializeField]
27
+ protected TextMeshPro costText;
28
+
29
+ [SerializeField]
30
+ protected TextMeshPro nameText;
31
+
32
+ [SerializeField]
33
+ protected TextMeshPro bodyText;
34
+
35
+ protected GameObject previewCard;
36
+
37
+ public int manaCost { get; protected set; }
38
+
39
+ [HideInInspector]
40
+ public bool isPreview;
41
+
42
+ protected virtual void Awake()
43
+ {
44
+ Assert.IsNotNull(glowSprite);
45
+ Assert.IsNotNull(pictureSprite);
46
+ Assert.IsNotNull(costText);
47
+ Assert.IsNotNull(nameText);
48
+ Assert.IsNotNull(bodyText);
49
+ }
50
+
51
+ /// <summary>
52
+ /// カードの情報を取り込む
53
+ /// </summary>
54
+ /// <param name="card"></param>
55
+ public virtual void PopulateWithInfo(RuntimeCard card)
56
+ {
57
+ this.card = card;
58
+
59
+ var gameConfig = GameManager.Instance.config;
60
+ /*
61
+
62
+ var cardType = gameConfig.cardTypes.Find(x => x.id == card.cardId);
63
+ Assert.IsNotNull(cardType);
64
+ pictureSprite.sprite = Resources.Load<Sprite>(cardType.GetStringProperty("Picture"));
65
+
66
+ */
67
+
68
+ var libraryCard = gameConfig.GetCard(card.cardId);
69
+ Assert.IsNotNull(libraryCard);
70
+ nameText.text = libraryCard.name;
71
+ bodyText.text = libraryCard.GetStringProperty("Text");
72
+
73
+ var cost = libraryCard.costs.Find(x => x is PayResourceCost);
74
+ if (cost != null)
75
+ {
76
+ var payResourceCost = cost as PayResourceCost;
77
+ manaCost = payResourceCost.value;
78
+ costText.text = manaCost.ToString();
79
+ }
80
+
81
+ pictureSprite.sprite = Resources.Load<Sprite>(string.Format("Images/{0}", libraryCard.GetStringProperty("Picture")));
82
+ var material = libraryCard.GetStringProperty("Material");
83
+ if (!string.IsNullOrEmpty(material))
84
+ {
85
+ pictureSprite.material = Resources.Load<Material>(string.Format("Materials/{0}", material));
86
+ }
87
+ }
88
+
89
+ /// <summary>
90
+ /// ライブラリーの情報を移行
91
+ /// </summary>
92
+ /// <param name="card"></param>
93
+ public virtual void PopulateWithLibraryInfo(Card card)
94
+ {
95
+ nameText.text = card.name;
96
+ bodyText.text = card.GetStringProperty("Text");
97
+
98
+ var cost = card.costs.Find(x => x is PayResourceCost);
99
+ if (cost != null)
100
+ {
101
+ var payResourceCost = cost as PayResourceCost;
102
+ manaCost = payResourceCost.value;
103
+ costText.text = manaCost.ToString();
104
+ }
105
+
106
+ pictureSprite.sprite = Resources.Load<Sprite>(string.Format("Images/{0}", card.GetStringProperty("Picture")));
107
+ var material = card.GetStringProperty("Material");
108
+ if (!string.IsNullOrEmpty(material))
109
+ {
110
+ pictureSprite.material = Resources.Load<Material>(string.Format("Materials/{0}", material));
111
+ }
112
+ }
113
+
114
+ /// <summary>
115
+ /// プレイできるか
116
+ /// </summary>
117
+ /// <param name="owner"></param>
118
+ /// <returns></returns>
119
+ public virtual bool CanBePlayed(DemoHumanPlayer owner)
120
+ {
121
+ return owner.isActivePlayer && owner.manaStat.effectiveValue >= manaCost;
122
+ }
123
+
124
+ /// <summary>
125
+ /// ハイライト付いてるか判定
126
+ /// </summary>
127
+ /// <returns></returns>
128
+ public bool IsHighlighted()
129
+ {
130
+ return glowSprite.enabled;
131
+ }
132
+
133
+ /// <summary>
134
+ /// ハイライトをセット
135
+ /// </summary>
136
+ /// <param name="enabled"></param>
137
+ public void SetHighlightingEnabled(bool enabled)
138
+ {
139
+ glowSprite.enabled = enabled;
140
+ }
141
+ }
142
+
143
+ ```
144
+
145
+ ### 聞きたいこと
146
+ RuntimeCard、あるいはCardViewクラスに、上記JSONファイルから値を持ってきてPlayCardクラスに渡しトークンBを召喚するにはどのようなコードを組めば良いでしょうか。
147
+ 慣れない質問で要領を得ない書き方になっているかもしれませんが、何卒よろしくお願い致します。
148
+ 不足している情報があればコメントお願いします。

1

重複のため削除しました

2018/04/30 12:16

投稿

imohori708
imohori708

スコア10

answer CHANGED
@@ -1,143 +1,1 @@
1
- 以下、手札からボードにカードを召喚する箇所と思しきソースコード
2
- ```C#
3
- public void PlayCard(CardView card)
4
- {
5
- if (card.CanBePlayed(this))
6
- {
7
- gameUI.endTurnButton.SetEnabled(false);
8
-
9
- var gameConfig = GameManager.Instance.config;
10
- var libraryCard = gameConfig.GetCard(card.card.cardId);
11
- //スペルかミニオンか
12
- var cardType = gameConfig.cardTypes.Find(x => x.id == libraryCard.cardTypeId);
13
- if (cardType.name == "Creature")
14
- {
15
- //ミニオンをボード上にプレハブ化
16
- var boardCreature = Instantiate(boardCreaturePrefab);
17
-
18
- var board = GameObject.Find("PlayerBoard");
19
- boardCreature.tag = "PlayerOwned";
20
- boardCreature.transform.parent = board.transform;
21
- boardCreature.transform.position = new Vector2(1.9f * playerBoardCards.Count, 0);
22
- boardCreature.GetComponent<BoardCreature>().ownerPlayer = this;
23
- boardCreature.GetComponent<BoardCreature>().PopulateWithInfo(card.card);
24
-
25
- //手札からプレイしたカードを消す
26
- playerHandCards.Remove(card);
27
- RearrangeHand();
1
+ 内容重複のため削除済み
28
- playerBoardCards.Add(boardCreature.GetComponent<BoardCreature>());
29
-
30
- //手札のカードのオブジェクトを削除
31
- Destroy(card.gameObject);
32
-
33
- currentCreature = boardCreature.GetComponent<BoardCreature>();
34
-
35
- //ボードの描画処理
36
- RearrangeBottomBoard(() =>{var triggeredAbilities = libraryCard.abilities.FindAll(x => x is TriggeredAbility);
37
- TriggeredAbility targetableAbility = null;
38
- foreach (var ability in triggeredAbilities)
39
- {
40
- var triggeredAbility = ability as TriggeredAbility;
41
- var trigger = triggeredAbility.trigger as OnCardEnteredZoneTrigger;
42
- if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget)
43
- {
44
- targetableAbility = triggeredAbility;
45
- break;
46
- }
47
- }
48
-
49
- // Preemptively move the card so that the effect solver can properly check the availability of targets
50
- // by also taking into account this card (that is trying to be played).
51
- //プレイしようとしているカードも考慮して、エフェクトソルバーがターゲットの使用可能性を適切にチェックできるように、先制してカードを移動します。
52
- playerInfo.namedZones["Hand"].RemoveCard(card.card);
53
- playerInfo.namedZones["Board"].AddCard(card.card);
54
-
55
- //ターゲットを取るアビリティがあり、且つターゲットがいる場合
56
- if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target))
57
- {
58
- var targetingArrow = Instantiate(spellTargetingArrowPrefab).GetComponent<SpellTargetingArrow>();
59
- boardCreature.GetComponent<BoardCreature>().abilitiesTargetingArrow = targetingArrow;
60
- targetingArrow.effectTarget = targetableAbility.target;
61
- targetingArrow.targetType = targetableAbility.target.GetTarget();
62
- targetingArrow.onTargetSelected += () =>
63
- {
64
- PlayCreatureCard(card.card, targetingArrow.targetInfo);
65
- effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo);
66
- currentCreature = null;
67
- gameUI.endTurnButton.SetEnabled(true);
68
- };
69
- targetingArrow.Begin(boardCreature.transform.localPosition);
70
- }
71
- else
72
- {
73
- PlayCreatureCard(card.card);
74
- effectSolver.MoveCard(netId, card.card, "Hand", "Board");
75
- currentCreature = null;
76
- gameUI.endTurnButton.SetEnabled(true);
77
- }
78
- boardCreature.GetComponent<BoardCreature>().fightTargetingArrowPrefab = fightTargetingArrowPrefab;
79
- });
80
- }
81
- //スペルの場合
82
- else if (cardType.name == "Spell")
83
- {
84
- var spellsPivot = GameObject.Find("PlayerSpellsPivot");
85
- var sequence = DOTween.Sequence();
86
- sequence.Append(card.transform.DOMove(spellsPivot.transform.position, 0.5f));
87
- sequence.Insert(0, card.transform.DORotate(Vector3.zero, 0.2f));
88
- sequence.Play().OnComplete(() =>
89
- {
90
- card.GetComponent<SortingGroup>().sortingLayerName = "BoardCards";
91
- card.GetComponent<SortingGroup>().sortingOrder = 1000;
92
-
93
- var boardSpell = card.gameObject.AddComponent<BoardSpell>();
94
-
95
- var triggeredAbilities = libraryCard.abilities.FindAll(x => x is TriggeredAbility);
96
- TriggeredAbility targetableAbility = null;
97
- foreach (var ability in triggeredAbilities)
98
- {
99
- var triggeredAbility = ability as TriggeredAbility;
100
- var trigger = triggeredAbility.trigger as OnCardEnteredZoneTrigger;
101
- //トリガーがあり、ボードに入ることがトリガーで、且つユーザーがターゲットを指定している場合
102
- if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget)
103
- {
104
- targetableAbility = triggeredAbility;
105
- break;
106
- }
107
- }
108
-
109
- currentSpellCard = card;
110
- //ターゲットを取るアビリティがあり、且つターゲットがいる場合、ターゲットを指定してスペルの処理をする
111
- if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target))
112
- {
113
- var targetingArrow = Instantiate(spellTargetingArrowPrefab).GetComponent<SpellTargetingArrow>();
114
- boardSpell.targetingArrow = targetingArrow;
115
- targetingArrow.effectTarget = targetableAbility.target;
116
- targetingArrow.targetType = targetableAbility.target.GetTarget();
117
- targetingArrow.onTargetSelected += () =>
118
- {
119
- PlaySpellCard(card.card, targetingArrow.targetInfo);
120
- effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo);
121
- currentSpellCard = null;
122
- gameUI.endTurnButton.SetEnabled(true);
123
- };
124
- targetingArrow.Begin(boardSpell.transform.localPosition);
125
- }
126
- else
127
- //そうでなければそのまま処理
128
- {
129
- PlaySpellCard(card.card);
130
- effectSolver.MoveCard(netId, card.card, "Hand", "Board");
131
- currentSpellCard = null;
132
- gameUI.endTurnButton.SetEnabled(true);
133
- }
134
- });
135
- }
136
- }
137
- else
138
- {
139
- card.GetComponent<HandCard>().ResetToInitialPosition();
140
- }
141
- }
142
- ```
143
- 上記メソッドの引数となっているCarViewクラスは、GUIでマウス左クリック時にぶつかったobjectを判定することによって値を取得してきているため、GUI描画のない、デッキやハンドの外からトークンBを選択することは出来ません。