・ゲーム開発編:p.144 transformプロパティ から
・文法編:プロパティ から
文法編:構造体【再掲載】
・構造体はC言語に元々ある仕組みで、複数の変数をグループ化して扱う手法
・なお、複数の同じ型と意味の変数をグループ化するのが配列、型や意味が異なる変数をグループ化するのが構造体
・Vector3構造体の場合、3次元データを表す3つの変数x、y、zをグループ化して扱うためなどに用いる
・構造体はintなどと同様にデータ型として利用できる(クラスにおける変数と同様)
・C#では、C言語で書かれたプログラムの移植時に、クラスにすると効率が落ちるのを避けるために「軽量クラス」
として「C#の構造体」が利用可能
・よって、C言語の構造体とは異なり、「C#の構造体」ではデータ以外にメソッドなども記述でき、継承を行わない
クラスなどで用いることが多い
・Vector3構造体はUnityが提供するものだが、プログラマが自前の構造体を定義して用いることも可能
・書式例: struct 構造体名 { 定義内容 }
・構造体もクラスと同様に、構造体名を型とするオブジェクト名を定義してオブジェクトを生成して用いる
提出フォロー:文法編:構造体の作成例 ex0727b【再掲載】
using UnityEngine;
public class ex0727b : MonoBehaviour{
struct Map { //2D座標の構造体の定義
public int x; //Map構造体の持つデータ
public int y; //同上
}
void Start() {
Map player = new Map(); //Mapオブジェクトplayerを生成
player.x = 100; //playerが持つ変数xに代入(プレイヤーのX座標を設定)
player.y = 200; //playerが持つ変数yに代入(プレイヤーのY座標を設定)
Debug.Log(player.x + ", " + player.y); //playerが持つ変数の値を出力
}
}
文法編:プロパティ
・プロパティはクラスや構造体に含むことができるメンバであり、クラス変数(インスタンス変数)やメソッドと同類
・プロパティは、変数と同様に扱うとアクセッサと呼ばれる内蔵された処理内容が動作する仕組み
・書式: アクセス修飾子 型 プロパティ名 { get { 処理① } set { 処理② } }
処理①には値を返す「return」を含む式など
処理②には値を設定する「value」を含む式など(※valueには外部から与えた値が入る)
・プロパティは基本的にクラス変数(インスタンス変数)へのアクセス手段を提供するもので、アクセスにルールを
定めたい場合に便利
例:「値の変更不可」「負の数不可などの条件」「なんらかの前提があれば」
・書式例
private double weight; //体重(外部からの操作は不可)
public double KG { //プロパティの定義
get { return weight; } //値を返すのは無制限
set { if (value > 0) { weight = value; } } //値を設定するにはルールあり
}
・利用側は変数と同様に、代入や利用が可能
例:
Debug.Log(インスタンス名.KG); // KGのgetが動作してreturnされた値が得られる
⇒ Debug.Log(インスタンス名.weight); の代わりになる(weightはprivateなのでエラーになる)
インスタンス名.KG = 70.); // KGのsetが動作してvalueに70.2が入って実行される
⇒ インスタンス名.weight = 70.2; の代わりになる(weightはprivateなのでエラーになる)
インスタンス名.KG = -1; // KGのsetが動作してvalueに-1が入って実行されるが代入されない
演習 ex0803a.cs プロパティの基礎
・クラスBMI1を定義し、privateなdouble型のインスタンス変数height、weightを定義する ・height用のプロパティHM、weight用のプロパティKGを定義して、正の数のみ格納できるように制限する ・get、setが動作していることを確認しよう
作成例
using UnityEngine;
public class ex0803a : MonoBehaviour {
class BMI1 { //BMIを扱うクラスの定義
private double height; //身長(内部用)
private double weight; //体重(内部用)
public double HM { //heightを扱うプロパティ
get { //値を返すのは無条件
Debug.Log("HM.getが動作"); //確認用
return height;
}
set { //値を設定するにはルールあり
Debug.Log("HM.setが動作"); //確認用
if (value > 0) {
height = value;
}
}
}
public double KG { //プロパティの定義
get { return weight; } //値を返すのは無制限
set { if (value > 0) { weight = value; } } //値を設定するにはルールあり
}
}
void Start() {
BMI1 bmi = new BMI1(); //BMI1オブジェクトbmiを生成
bmi.HM = 1.72; //プロパティのset経由で身長を代入
Debug.Log("身長:" + bmi.HM); //プロパティのget経由で身長を得て表示
bmi.HM = -5; //無視される
Debug.Log("身長:" + bmi.HM); //プロパティのget経由で身長を得て表示
bmi.KG = 72.5; //プロパティのset経由で体重を代入
Debug.Log("体重:" + bmi.KG); //プロパティのget経由で身長を得て表示
bmi.KG = -5; //無視される
Debug.Log("体重:" + bmi.KG); //プロパティのget経由で身長を得て表示
}
}
p.144 transformプロパティ
・https://docs.unity3d.com/ja/2021.2/ScriptReference/MonoBehaviour.html ・p.144の図ではやや分かりづらいが: ① 自前のUnity用ソースはMonoBehaviourクラスを継承しているので、MonoBehaviourクラスの持つメンバが引き継がれている ② MonoBehaviourクラスはBehaviourクラスを継承しており、継承メンバーの中にTransform型のtransformプロパティがある ③ このプロパティの定義はVisual Studioで見ると「get;」しかないので、代入を不可とするために定義されていることがわかる
p.145 変数のように使えるけれどちょっと違うプロパティ
・上記の通りで「外部から自由に使えるpublic」か「外部から全く使えないprivate」しか設定できない変数について、 プロパティを経由することで、ルールの設定が可能になる ・transformプロパティの場合、getが可能なので「Vector3 pos = transform.position」というように値を得られる ・しかし、トラブルを避けるためにsetが不可なので、transformではなく、transform.positionに対して代入を行う ・動作としては、shooterの位置情報をtransform.positionからposに取り出して、そのメンバであるX座標を示す pos.xの値を操作してtransform.positionに書き戻すことで、動かしている