i-school - Testクラス
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// テスト用クラス
/// クラスとコンポーネントの取得、オン/オフ、利用方法について
/// </summary>
public class Test : MonoBehaviour
{    
    [SerializeField,Header("コライダー(接触判定)のオンオフ用")]
    public BoxCollider boxCollider;
    [SerializeField, Header("レンダラー(描画)のオンオフ用")]
    public MeshRenderer meshRenderer;
    [SerializeField, Header("マテリアル(色)の設定用")]
    public Material material;

    [SerializeField,Range(0,2),Header("変更する色の設定値")]
    public int colorNumber;
    [SerializeField, Header("Planeかどうかの判定用 trueならPlane")]
    public bool isPlaneFlag;

    private bool isRigidGet;    // 指定した条件(ここではRigidBodyコンポーネントを持っている)かどうかを判定するフラグ

    [SerializeField,Header("回転させる軸と回転させる回数")]
    public int x;
    public int y;
    public int z;

    void Start()
    {
        // このクラスがアタッチされているオブジェクトがPlaneかどうか判定し、分岐させる
        if (isPlaneFlag) {  // isPlaneFlag == true
            // Planeならこちらのメソッドを実行
            // 引数としてcolorNumberというint型の数値を渡している
            ChangeMatColor(colorNumber);
        } else {
            // Planeではない(Cube)なら、こちらのメソッドを実行
            // 引数としてColor.blueという、Color型の色情報を渡している
            SetMatColor(Color.blue);
        }
    }

    /// <summary>
    /// 常に動いているメソッド。ここではキーボード入力を監視し、常に入力を受け付ける状態にする
    /// if文であるのは、対応するキー入力があった場合のみ処理を実行するため
    /// 条件がないと常に動いてしまう
    /// </summary>
    void Update()
    {
        // ボタンを押す度にBoxColliderコンポーネントの状態をオン・オフ切り替える
        // オンならそのコンポーネントは有効 オフなら無効
        // 操作したいコンポーネントが代入されている変数を使う = アクセスできる
        if (Input.GetKeyDown(KeyCode.A)) {
            // [変数名.enabled]で現在のコンポーネントの状態を確認できる。trueならオンの状態
            if (boxCollider.enabled == true) {
                // オフに切り替える
                boxCollider.enabled = false;
            } else {
                // ifの条件でないなら、こちらの処理を実行 = falseの場合
                boxCollider.enabled = true;
            }
            // 1行で書く場合
            //boxCollider.enabled = !boxCollider.enabled;
        }

        // ボタンを押す度にBoxColliderコンポーネントの持つIsTriggerプロパティのオン・オフを切り替える
        if (Input.GetKeyDown(KeyCode.S)) {
            if (!boxCollider.isTrigger) {   // boxCollider.isTrigger == falseと同じ
                // オフならオンにする
                boxCollider.isTrigger = true;
            } else {
                // オンならオフにする
                // if-else文なので、必ずどちらかの分岐に入る
                boxCollider.isTrigger = false;
            }
        }

        // ボタンを押す度にMeshRendererコンポーネントのオン・オフを切り替える
        if (Input.GetKeyDown(KeyCode.D)) {
            meshRenderer.enabled = !meshRenderer.enabled;
        }

        // ボタンを押す度にMaterialの色を変更する
        if (Input.GetKeyDown(KeyCode.F)) {
            // このクラスの持つメソッドを呼び出し実行する
            // 引数としてcolorNumberというint型の数値を渡す
            ChangeMatColor(colorNumber);
        }

        // ボタンを押したとき
        if (Input.GetKeyDown(KeyCode.G)) {
            // isPlaneFlagがfalseであり、かつisRigidGetがfalseである場合
            if (!isPlaneFlag && !isRigidGet) {  // isPlaneFlag == false && isRigidGet == false
                // このゲームオブジェクトに新しくRigidBodyコンポーネントを追加する
                gameObject.AddComponent<Rigidbody>();
                // RigidBodyを持っているかどうかのフラグをオンにし、持っている状態にする
                isRigidGet = true;
            }
            if (isRigidGet) {  // isRigidGet == true
                // すでにRigidBodyを追加している状態である場合
                // RigidBody型の変数rbを宣言し、RigidBodyを取得してアクセスできるようにする
                Rigidbody rb = GetComponent<Rigidbody>();

                // RigidBodyコンポーネントの持つIsKinematicプロパティの状態を見て、オン・オフを切り替える
                if (!rb.isKinematic) {
                    rb.isKinematic = true;
                } else {
                    rb.isKinematic = false;
                }
            }
        }

        // ボタンを押したとき
        if (Input.GetKeyDown(KeyCode.H)) {
            // isRigidGetがtrueなら = RigidBodyコンポーネントを持っているなら
            if (isRigidGet) {
                // RigidBodyコンポーネントを削除する
                Destroy(GetComponent<Rigidbody>());
                // 所有フラグをfalseにし、RigidBodyコンポーネント持っていない状態にする
                isRigidGet = false;
                // 落下しているCubeの位置を初期位置に戻す
                float pos = 3.0f;
                transform.position = new Vector3(transform.position.x,pos,transform.position.z);
            }
        }
    }

    /// <summary>
    /// マテリアルの色の初期設定処理
    /// </summary>
    /// <param name="argumentColor"></param>
    private void SetMatColor(Color argumentColor) {
        // 引数として渡されたargumentColorを使い色を変更(初期設定)する
        // 設定にはMaterial型の変数materialの持つcolorにアクセスする
        material.color = argumentColor;
        colorNumber = 1;
    }

    /// <summary>
    /// マテリアルの色を変える処理
    /// public修飾子なので、他のクラスからでもこのメソッドを実行できる
    /// </summary>
    /// <param name="argumentColorNumber"></param>
    public void ChangeMatColor(int argumentColorNumber) {
        // 引数として渡されたargumentColorNumberに入ってる番号を使い、分岐により色を設定する
        // ここでもmaterial.colorにアクセスすることで色を変更する
        // switch文はいずれかのcaseに入ると終了する( = breakで抜けている)
        switch (argumentColorNumber) {
            case 0:
                material.color = Color.blue;
                break;
            case 1:
                material.color = Color.green;
                break;
            case 2:
                material.color = Color.red;
                break;
        }
        // 色の番号を1ずつ加算する = 次回以降、別の分岐に入るようにする
        colorNumber++;
        // 色の設定値は2までなので、3以上の数値になったら0に戻す処理を入れておく
        if(colorNumber >= 3) {
            colorNumber = 0;
        }
        Debug.Log(colorNumber);
    }

    /// <summary>
    /// Cubeを回転させる処理
    /// </summary>
    /// <param name="argumentEulerAngle"></param> 回転させる角度
    /// <param name="argumentAxis"></param> 回転させる軸 
    /// <param name="isReverseFlag"></param> 正回転か逆回転かどうかのフラグ 基本はfalseで正回転
    public void RotateCube(float argumentEulerAngle, int argumentAxis, bool isReverseFlag = false) {
        // 回転させたい軸の情報をrotationPosに代入
        Quaternion rotationPos = transform.rotation;
        Debug.Log(transform.rotation);

        // 逆回転させるフラグがON(true)なら、回転させる向きを逆にする
        if (isReverseFlag) {
            argumentEulerAngle = -argumentEulerAngle;
            Debug.Log("Reverse");
        }
        // 回転させる軸を決める分岐 いずれかのcaseに入る
        // 軸ごとに回転した回数がカウントされる
        switch (argumentAxis) {
            case 0:  // x軸
                x++;
                rotationPos.x = argumentEulerAngle * x;
                break;
            case 1:  // y軸
                y++;
                rotationPos.y = argumentEulerAngle * y;
                break;
            case 2:  // z軸
                z++;
                rotationPos.z = argumentEulerAngle * z;
                break;
        }
        // 上記の分岐で決定した角度で回転させる
        // 分岐以外の2つの軸は元々の数値がそのまま再度入る
        transform.rotation = Quaternion.Euler(rotationPos.x, rotationPos.y, rotationPos.z);
        Debug.Log(transform.rotation);
    }

    /// <summary>
    /// Cubeの回転を初期状態に戻す処理
    /// </summary>
    public void ResetRotate() {
        // identityはゲーム開始時(生成時)の回転軸の情報の状態
        transform.rotation = Quaternion.identity;
        //transform.rotation = Quaternion.Euler(0,0,0);        
    }

    /// <summary>
    /// Cubeの各回転軸の回転回数を0に戻す処理
    /// </summary>
    /// <param name="argumentCount"></param>
    public void ResetAxisCount(int argumentCount) {
        x = argumentCount;
        y = argumentCount;
        z = argumentCount;
    }
}