1.変数のアクセス修飾子
変数のアクセス修飾子はクラス内外でどこまで許可するかを制御するものでC#では主に次のアクセス修飾子があります。
・public(パブリック変数) どこからでもアクセス可能。
・private(プライベート変数) 定義されたクラス内でのみアクセス可能。
・protected(プロテクテッド変数) 定義されたクラスおよびその派生クラス(継承したクラス)からアクセス可能。
パブリック変数はUnityエディッタのInspecterに表示され編集ができます。プライベート変数、プロテクテッド変数についても[SerializeField]属性を付けることでInspecterに表示され編集ができます。
2.アクセッサとプロパティ
プライベート変数、プロテクテッド変数はクラス外からアクセスできるようにするためにはアクセッサメソッド(getとset)を持つようにします。
プロパティはアクセッサを使って値の読み書きができるクラスのメンバーを指します。
(Unityで使われるプロパティの例)
・Input.mousePosition
Input:Unityの組み込みクラスで、ユーザーの入力(マウス、キーボード、タッチなど)を取得するためのメソッドやプロパティを含みます。
mousePosition:Inputクラスのプロパティで現在のマウスの位置をスクリーン座標で取得します。
・Camera.main
Camera:Unityの組み込みクラスで、シーン内のカメラに関連する機能を提供します。
main:Cameraクラスの静的プロパティで、シーン内で最初に見つかった”Main Camera”タグを持つカメラを返します。
3.変数の定義とアクセス方法
下記にパブリック変数、プライベート変数、プロテクテッド変数の定義と、変数を定義したクラスの外からアクセスする方法を記載します。
Playerクラスでアクセス修飾子の異なる3つの変数を定義し、プロテクテッド変数とプライベート変数のアクセッサを実装し、Playerオブジェクトにアタッチします。
public string playername = "yamada"; // パブリック変数
[SerializeField] protected int height = 180; // プロテクテッド変数
[SerializeField] private int weight = 50; // プライベート変数
:
public int Weight // プロパティ
{
get { return weight; } // 値を取得する
set { weight = Mathf.Clamp(value, 0, 200); } // 値を設定する(例: 範囲制限)
}
public int Height // プロパティ
{
get { return height; } // 値を取得する
set { height = Mathf.Clamp(value, 0, 300); } // 値を設定する(例: 範囲制限)
}
変数を定義したクラス以外のクラスPlayerLoggerで変数を読み出します。
//Playerコンポーネントを持つゲームオブジェクトを探します
Player player = FindObjectOfType<Player>();
//変数playername, height, weightの値を読み出します
Debug.Log("Player Name: " + player.playername); // パブリック変数の読み出し
Debug.Log("Height: " + player.Height); // プロテクテッド変数はアクセッサを使って読み出し
Debug.Log("Weight: " + player.Weight); // プライベート変数はアクセッサを使って読み出し

パブリック変数の他、[SerializeField]属性を付けることでプライベート変数、プロテクテッド変数もInspecterで編集できます

パブリック変数(PlayerName)プライベート変数(Weight)、プロテクテッド変数(Height)を読み出した結果(Inspecterの値が優先される)

Playerクラスのスクリプトファイル
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string playername = "yamada"; // パブリック変数
[SerializeField] protected int height = 180; // プロテクテッド変数
[SerializeField] private int weight = 50; // プライベート変数
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public int Weight // プロパティ
{
get { return weight; } // 値を取得する
set { weight = Mathf.Clamp(value, 0, 200); } // 値を設定する(例: 範囲制限)
}
public int Height // プロパティ
{
get { return height; } // 値を取得する
set { height = Mathf.Clamp(value, 0, 300); } // 値を設定する(例: 範囲制限)
}
}
PlayerLoggerクラスのスクリプトファイル
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerLogger : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// Player コンポーネントを持つゲームオブジェクトを探す
Player player = FindObjectOfType<Player>();
if (player != null)
{
// playername, height, weight をログに出力
Debug.Log("Player Name: " + player.playername); // パブリック変数の読み出し
Debug.Log("Height: " + player.Height); // プロテクテッド変数はアクセッサを使って読み出し
Debug.Log("Weight: " + player.Weight); // プライベート変数はアクセッサを使って読み出し
}
else
{
Debug.Log("Player コンポーネントが見つかりませんでした!");
}
}
// Update is called once per frame
void Update()
{
}
}
End