見出し画像

[Unity Blocks 6]ピースの色を変える

二人のプレイヤーに合わせてピースの色を2種類に変えたいと思います。

2種類の色を扱うには2種類のマテリアルを使用する必要があります。まずはマテリアルを2種類作ります。

マテリアルを作る

作るマテリアルは
透明な赤色、青色を作ります。

赤色のマテリアルの設定です。

画像1

Rendering ModeはFade、ソースはAlbedo Alphaにしておきます。色がそれっぽい。色の設定は

画像2

アルファ値(Aの値)が透明度に関係してきます。

同様に青色も作ります。

スクリプトでマテリアルを変更する

後はスクリプトで色を選択していきます。先ほどのスクリプトに付け足します

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dot : MonoBehaviour
{
   [SerializeField]
   Material[] Materials;

   Vector3 SpawnPoint;
   Vector3 DotPoint;
   int PlayerNum;
   const int MaxPlayer = 2;

   void Start()
   {
       SpawnPoint = new Vector3(-0.065f, 0.3f, 0.065f);
       DotPoint = this.transform.position;
   }

   void Update()
   {
       if (Input.GetKeyDown(KeyCode.F))
       {
           GameObject NewPiece = Instantiate((GameObject)Resources.Load("P3-2"));
           NewPiece.transform.position = SpawnPoint;
           SetMaterialToChild(NewPiece, Materials[PlayerNum % 2]);
           if (++PlayerNum == MaxPlayer)
               PlayerNum = 0;
       }
       if (Input.GetKeyDown(KeyCode.W))
           MoveSpawnPoint(new Vector3(0f, 0f, 0.01f));
       if (Input.GetKeyDown(KeyCode.S))
           MoveSpawnPoint(new Vector3(0f, 0f, -0.01f));
       if (Input.GetKeyDown(KeyCode.D))
           MoveSpawnPoint(new Vector3(0.01f, 0f, 0f));
       if (Input.GetKeyDown(KeyCode.A))
           MoveSpawnPoint(new Vector3(-0.01f, 0f, 0f));
   }

   void MoveSpawnPoint(Vector3 diff)
   {
       this.transform.position += diff;
       SpawnPoint += diff;
   }

   void SetMaterialToChild(GameObject Obj, Material Material)
   {
       foreach (Transform Child in Obj.transform)
       {
           Child.GetComponent<Renderer>().material = Material;
       }
   }
}

主にピースを置く際にコードを追加しています。順にみていきます

[SerializeField]が追加されています。これはMaterialsの変数をUnityのアプリから代入できます。
メリット:オブジェクトをコードから追うことが難しい場合でも簡単に指定して代入できる。
デメリット:もしスクリプトが外れた場合、再度アプリから指定する必要があり、めんどくさい。

Publicな変数とすることでも同じことができますが、特に他のスクリプトからのアクセスは現状考えていないので、SerializeFieldにしましょう。

アプリの設定方法は、こんな感じです。

画像3

SerializeFieldに配列を指定している場合、配列数を指定する必要があります。要素0,1にはマテリアルをドラッグ&ドロップしてください。

コードに戻ります。SetMaterialToChildの自作関数により、第1引数にゲームオブジェクト、第2引数にセットするマテリアルを指定します。これにより、第1引数で指定したプレハブの子オブジェクト全てのマテリアルを指定したマテリアルにしています。置く度にマテリアルは変わっていくようにしています。

動かしてみる

画像4

これでいい感じですね。

次回

この記事が気に入ったらサポートをしてみませんか?