Unity チュートリアルのタワーディフェンステンプレートを触ってみる(39)

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(38)では SingleTowerPlacementArea とTowerPlacementGrid のインタフェースである IPlacementArea の解説を行った。今回は SingleTowerPlacementArea の解説を行っていく。

1.タワーディフェンステンプレートのステージの設定編 – SingleTowerPlacementArea.cs

SingleTowerPlacementArea.cs について稚拙ながら解説

「SingleTowerPlacementArea.cs」は「Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs」の指しておりスクリプトについては以下の通り。内容としては一個のタワー設置に関する処理を行っている。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using Core.Utilities;
using TowerDefense.UI.HUD;
using UnityEngine;

namespace TowerDefense.Towers.Placement
{
    /// <summary>
    /// An area suitable for placing a single tower
    /// </summary>
    [RequireComponent(typeof(Collider))]
    public class SingleTowerPlacementArea : MonoBehaviour, IPlacementArea
    {
        /// <summary>
        /// Visualisation prefab to instantiate
        /// </summary>
        public PlacementTile placementTilePrefab;
       
        /// <summary>
        /// Visualisation prefab to instantiate on mobile platforms
        /// </summary>
        public PlacementTile placementTilePrefabMobile;
       
        /// <summary>
        /// <see cref="PlacementTile"/> we've spawned on our spot
        /// </summary>
        PlacementTile m_SpawnedTile;

        /// <summary>
        /// If the area is occupied
        /// </summary>
        bool m_IsOccupied;

        /// <summary>
        /// Set up visualisation tile
        /// </summary>
        protected void Awake()
        {
            PlacementTile tileToUse;
#if UNITY_STANDALONE
            tileToUse = placementTilePrefab;
#else
            tileToUse = placementTilePrefabMobile;
#endif
           
            if (tileToUse != null)
            {
                m_SpawnedTile = Instantiate(tileToUse);
                m_SpawnedTile.transform.SetParent(transform);
                m_SpawnedTile.transform.localPosition = new Vector3(0f, 0.05f, 0f);
            }
        }

        /// <summary>
        /// Returns (0, 0), as there is only one available spot
        /// </summary>
        /// <param name="worldPosition"><see cref="Vector3"/> indicating world space coordinates to convert.</param>
        /// <param name="sizeOffset"><see cref="IntVector2"/> indicating size of object to center.</param>
        public IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset)
        {
            return new IntVector2(0, 0);
        }

        /// <summary>
        /// Returns transform.position, as there is only one available spot
        /// </summary>
        /// <param name="gridPosition">The coordinate in grid space</param>
        /// <param name="sizeOffset"><see cref="IntVector2"/> indicating size of object to center.</param>
        public Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset)
        {
            return transform.position;
        }

        /// <summary>
        /// Tests whether the placement area is valid.
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        public TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size)
        {
            return m_IsOccupied ? TowerFitStatus.Overlaps : TowerFitStatus.Fits;
        }

        /// <summary>
        /// Occupies the area
        /// </summary>
        /// <param name="gridPos"></param>
        /// <param name="size"></param>
        public void Occupy(IntVector2 gridPos, IntVector2 size)
        {
            m_IsOccupied = true;

            if (m_SpawnedTile != null)
            {
                m_SpawnedTile.SetState(PlacementTileState.Filled);
            }
        }

        /// <summary>
        /// Clears the area
        /// </summary>
        /// <param name="gridPos"></param>
        /// <param name="size"></param>
        public void Clear(IntVector2 gridPos, IntVector2 size)
        {
            m_IsOccupied = false;

            if (m_SpawnedTile != null)
            {
                m_SpawnedTile.SetState(PlacementTileState.Empty);
            }
        }

#if UNITY_EDITOR
        /// <summary>
        /// Draw the spot as a smalls phere in the scene view.
        /// </summary>
        void OnDrawGizmos()
        {
            Color prevCol = Gizmos.color;
            Gizmos.color = Color.cyan;

            Matrix4x4 originalMatrix = Gizmos.matrix;
            Gizmos.matrix = transform.localToWorldMatrix;

            Gizmos.DrawWireSphere(Vector3.zero, 1);

            Gizmos.matrix = originalMatrix;
            Gizmos.color = prevCol;
           
            // Draw icon too
            Gizmos.DrawIcon(transform.position + Vector3.up, "build_zone.png", true);
        }
#endif
    }
}

36行目 : 「protected void Awake()」は Unity 固有の起動処理を行っている。内容としてはタイルの設定を行っている。#if UNITY_STANDALONE で PC として起動されているか、携帯機として起動されているか判定し、使用するタイルの設定を行っている。

58行目 : 「public IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset)」は IPlacementArea で定義した関数の処理を作成している。内容としては new IntVector2(0, 0); の返却を行っている。これは一個のタワーのみしか置けないためである。

68行目 : 「public Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset)」は IPlacementArea で定義した関数の処理を作成している。内容としては transform.position の返却を行っている。これは一個のタワーのみしか置けないためである。

78行目 : 「public TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size)」は IPlacementArea で定義した関数の処理を作成している。内容としては領域が他のタワーで占有されているか判定しする。占有されていれば Overlaps を返却し、占有されていなければ Fits を返却している。

88行目 : 「public void Occupy(IntVector2 gridPos, IntVector2 size)」は IPlacementArea で定義した関数の処理を作成している。内容としてはエリアを占有状態に変更し、タイルに Filled 状態を設定している。

103行目 : 「public void Clear(IntVector2 gridPos, IntVector2 size)」は IPlacementArea で定義した関数の処理を作成している。内容としてはエリアを占有していない状態に変更し、タイルに Empty 状態を設定している。

スポンサーリンク
%d人のブロガーが「いいね」をつけました。