独自のポーション配置クラスを作成する

Tutorial

Beginner

+0XP

30 mins

(82)

Unity Technologies

 独自のポーション配置クラスを作成する

このチュートリアルでは、以下の活動を行います。

  • クラスの目的を特定する
  • コードをより効率的にするためにクラスを書く
  • クラスの特別な関数を追加してレビューする
  • クラスの変数を初期化する
  • コンソールでスクリプトの変更を確認する


このチュートリアルを終えると、「Creator Kit:コーディング入門」のゲームで使う、独自のポーション配置クラスを作成するために必要な知識が身に付きます。

Languages available:

1. クラスを使用してコードをより効率的にする

クラスがどのように機能するかを確認したので、SpawnerSampler スクリプトにクラスを作ってみましょう。クラスを使えばより効率的なコードを記述し、似たような関数をグループ化することができます。これは、ゲームのコードを作成する上で重要な事実です。パターンを見つけてそれを使い、思い通りに関数やプレイヤー体験を作成しましょう。

すでに知っていることを使って、ライフ回復ポーションを配置する時に使う角度を計算するクラスを作るところから始めましょう。

2. クラス宣言を書く

まず、クラス宣言を追加します。これは、SpawnerSample スクリプトファイルの SpawnerSample クラスの閉じ波括弧の後に配置します。

public class LootAngle
{
}

public キーワードとその機能については、次のチュートリアルで詳しく説明します。

3. データ型を特定する

次に、この関数で行う作業を処理するために必要なデータのタイプを識別する必要があります。これを行うために、作成するクラスの目的について考えてください。

このクラスは、ポーションを配置する角度を決まった手順によって計算する必要があります。これを行うには、以下の値を保存できるようにしておく必要があります。

  • 現在のポーションの角度(n
  • 新しいポーションが配置されるたびに位置に追加する必要がある角度(x°)

以上の考察より、次の方程式を計算すればいいことが分かります。

(新しく配置するポーションの位置を決める角度) = n + x°

4. 必要なデータ変数を宣言する

新しいクラス LootAngle で、方程式に必要なデータを格納する 2 つの int 型変数を宣言します。

1. いま配置しようとしているポーションの位置を決める角度(この変数は angle という名前にする)

2. 次にポーションを配置する位置を決めるために加算する角度(この変数は step という名前にする)

5. 変数宣言を確認する

前のステップで考えたことに基づけば、新しい LootAngle クラスに以下のようなコードが追加されているはずです。

public class LootAngle
{
    int angle;
    int step;
}

各命令はセミコロンで終了させ、コンパイラーがそれぞれ個別の命令であることを認識できるようにしておく必要があります。

6. 関数を追加する

最後に、次のポーションを配置する時に使う角度の値を計算する関数を追加する必要があります。

以下のように関数を LootAngle クラスに追加しましょう。

public class LootAngle
{
    int angle;
    int step;
    
    int NextAngle()
    {
        int currentAngle = angle;
        angle = Helpers.WrapAngle(angle + step);
        
        return currentAngle;
    }
}

7. 関数の内容のレビュー

このプロジェクトを通じて行ってきたように、すでに得た知識を使ってこの関数の重要な情報を見つけ出して、各部分がスクリプトで何をするかを理解してみてください。

関数を分解しましょう。

1.

int NextAngle()

この関数の型は int であり、void ではありません。これは、関数が何らかの命令を実行するだけでなく、結果(新しく配置するポーションの位置を決める角度)も返すためです。

このコードは、関数 NextAngle が整数(int 型の)値を返すことをコンパイラーに通知します。以前は関数で計算を行うものの結果を返さなかったため、void(「何もない」の意味)を使っていました。

2.

        int currentAngle = angle;

この命令は、現在の角度を currentAngle と呼ばれる新しい変数に格納します。

3.

        angle = Helpers.WrapAngle(angle + step);

次の命令は、次に配置するポーションの位置を決める角度を計算し、それを変数 angle に格納します。WrapAngle 関数は、角度の値を 0° から 360° の間に収めるように変換する、この Creator Kit にあらかじめ準備されている関数です。

4.

        return currentAngle;

この命令は、元の角度(命令を実行して値が増える前)を呼び出し元に返します。return キーワードの右側の値は、関数によって返される値になります。

8. 関数の計算を確認する

関数が必要な方程式の計算を実行していることを確認してみましょう。

public class LootAngle
{
    int angle;
    int step;
    
    int NextAngle()
    {
        int currentAngle = angle;
        angle = Helpers.WrapAngle(angle + step);
        
        return currentAngle;
    }
}


この関数は、指定した増分(step)を現在の角度に追加することにより、新しく配置するポーションの位置をおのおの計算する必要があります。angle = 0 および step = 45 として関数のレビューを始めましょう。

関数を初めて呼び出すと、以下のような処理が行われます。

1. currentAngle に 0 を格納します

2. angle を 0 + 45 = 45 に変更します

3. 0 を返す



2 回目に関数が呼び出されると、以下のようになります。

1. currentAngle に 0 を格納します

2. angle を 45 + 45 = 90 に変更します

3. 45 を返す



呼び出されるたびに同じ手順が実行されます。

9. 変数 angle と変数 step を初期化する

ほぼ関数が出来上がりました。あと欠けているものは、変数 angle と変数 step の初期化だけです。

LootAngle クラスがメモリ内のこれら 2 つの値のためのスペースを予約する必要があることをコンピューターに伝えましたが、それらに値を割り当てませんでした。デフォルトでは、値は 0 に設定されます。

ここでたとえば Init という関数を記述して、これらの変数の値を、与えた引数で初期化することができます。しかし、クラスにはコンストラクターと呼ばれる非常に便利な機能がありますので、それを使いましょう。


コンストラクタ―が何をするのか調べてみましょう。

1. SpawnerSample スクリプトで、Start 関数の上部(SpawnPotion の最初の呼び出しよりも前)に新しい行を作成します。

2. その行に次の命令を追加します。

LootAngle myLootAngle = new LootAngle();


特定のクラスの型を持つ新しい変数を作成する方法を学んだときのことを覚えているでしょうか。型名の後には、関数のように一組の丸括弧が続きます。これは、実際にはコンストラクターという関数を呼んでいるためです。

10. コンストラクターの引数を作成する

コンストラクターは、クラスとまったく同じ名前を持ち、その前に型(void など)が記述されていない特別な関数です。コンパイラーは、デフォルトで「隠し」コンストラクターを作成しますが、これは何もしません。これを自分で作成すると、個別に引数を指定できます。

自分でコンストラクターを作成するには、以下のようにします。

1. SpawnerSample スクリプトで、LootAngle クラスを見つけます。


2. 変数 angle と step を初期化する命令の下に、以下のコードを追加します。

LootAngle(int increment)
{
    step = increment;
    angle = 0;
}



3. 完成したクラスは以下のようになります。皆さんが作ったクラスと比較してみてください。

public class LootAngle
{
    int angle;
    int step;

    LootAngle(int increment)
    {
        step = increment;
        angle = 0;
    }
    
    int NextAngle()
    {
        int currentAngle = angle;
        angle = Helpers.WrapAngle(angle + step);
        
        return currentAngle;
    }
}


これで、コンストラクターは 1 つの引数を取るようになりました。この引数は、NextAngle 関数が呼び出されるたびに加算される増分で、値が変数 step に格納されます。また、変数 angle は0に初期化されます。


4. SpawnerSample スクリプトの Start 関数に戻り、LootAngle 変数を作成する命令を次のように修正します。

LootAngle myLootAngle = new LootAngle(45);



これで OK です。初めてクラスを作り、それを使用して変数を作る手順を完了しました。

11. Start 関数の内容を書き換える

独自のクラスを作成したので、そのクラスを使用するようにスクリプトを更新する必要があります。

ポーションの配置に LootAngle クラスを使用するようにスクリプトを修正しましょう。

1. SpawnerSample スクリプトの Start 関数を探す。

2. Start 関数内の命令を以下のように書き換えます。

LootAngle myLootAngle = new LootAngle(45);

//すべての呼び出しは角度を進めます!
SpawnPotion(myLootAngle.NextAngle());
SpawnPotion(myLootAngle.NextAngle());
SpawnPotion(myLootAngle.NextAngle());
SpawnPotion(myLootAngle.NextAngle());


3. 変更をスクリプトに保存する。

12. 変更をテストする

開発時は、エディターで変更をテストすることが重要です。

1. Unity エディターに戻り、コンソールウィンドウを確認する。


2. エラー CS0122 が 5 つ表示されているはずです。

このエラーは、保護レベルの設定が原因で関数にアクセスできないことを意味します。

LootAngle.NextAngle() は皆さんが書いた関数です。LootAngle.LootAngle は、クラス LootAngle にある LootAngle という名前の関数です。つまり、これはコンストラクターです。

しかし、なぜそれらにアクセスできないのでしょうか。次のチュートリアルで、public キーワードと、これらの関数にアクセスできるようにする方法について学習します。

13. チュートリアルのまとめ

このチュートリアルでは、以下の活動を行いました。

  • SpawnerSample スクリプトでカスタムクラスを作成した
  • コンストラクターを使用して変数を初期化した
  • Unity エディターで変更をテストし、保護レベルのエラーが出ていることを確認した


次のチュートリアルでは、保護レベルのエラーを修正し、public キーワードについて学習します。また、継承の概念と、この概念を使ってより効率的なコードを作成する方法についても説明します。

Complete this Tutorial