講義メモ

・p.62「エラーメッセージを読み解こう」から

ミニ演習 mini062

・p.62「エラーが発生しているスクリプト」を試そう
using UnityEngine;
public class mini062 : MonoBehaviour{
    void Start(){
        int kazu = 10;
        kazu = kazo * kazu;
        Debug.Log(kazu);
    }
    void Update()  {}
}

解説

・名称未発見のような単純な文法エラーであれば、C#(VS)側では日本語で、Unity側でもほぼ同じ意味の英語でエラー内容が示される。
・なお、エラーの位置情報はUnity側で表示されるが、これはエラーの発生場所であり、修正すべき場所がそこであるとは限らない

ミニ演習 mini062・続き

・p.62「エラーが発生しているスクリプト」を修正しよう
・それから、p.63のエラーメッセージが表示されるスクリプトにしよう
using UnityEngine;
public class mini062 : MonoBehaviour{
    void Start(){
        int kazu = 10;
        kazu = kazu * kazu;
        Debug.Lag(kazu); //LogをLagと打ち間違えている
    }
    void Update()  {}
}

ミニ演習 mini062・続き2

・p.63のエラーメッセージが表示されるスクリプトを修正しよう
・p.33の説明のとおり「using UnityEngine;」を省略(コメントアウト)してみよう
//using UnityEngine;
public class mini062 : UnityEngine.MonoBehaviour{
    void Start(){
        int kazu = 10;
        kazu = kazu * kazu;
        UnityEngine.Debug.Log(kazu); //名前空間指定でクラスのメソッドを呼ぶ
    }
    void Update()  {}
}

ミニ演習 mini062・続き3

・p.64のエラーメッセージが表示されるスクリプトにしよう
using UnityEngine;
public class mini062 : MonoBehaviour{
    void Start(){
        int kazu = 10.1; //暗黙の型変換ができないのでエラー
        kazu = kazu * kazu;
        Debug.Log(kazu); 
    }
    void Update()  {}
}

型があっていないときに表示されるエラー

・double型の値や変数をint型の変数に代入すると、小数点以下の情報が失われてしまうので、エラーとなる
※ 言語によってはエラーにならず、小数点以下の情報をカットするものもある
・なお、小数点以下がゼロである実数リテラルであっても、整数と実数の扱いの違いから、同じ意味のエラーになる

ミニ演習 mini062・続き4

・p.64のエラーメッセージが表示されるスクリプトを修正しよう
・int型へのキャストを追記すること

diffツールでスクリプトの間違いをチェックする

・2つのテキストの差異を表示してくれるオンラインツール
 https://www.diffchecker.com/
・なお、オフラインツールがWindowsから提供されている

今週の話題

販売本数ランキング 今回トップは「桃太郎電鉄ワールド ~地球は希望でまわってる!~(Switch)」GO!
「ハイカジ」へのピボットで業績好調のカヤック、eスポーツ事業は次のステージへ【ゲーム企業の決算を読む】GO!
『UNDERTALE』『ホットライン・マイアミ』のゲームエンジン「Game Maker」非商用利用に限り無償化―1回限りのライセンス購入も可能に GO!
『アクションゲームツクールMV』プレーヤーアプリをオープンソース化―カスタマイズしてゲーム制作の自由度向上へ GO!
マーベラスがインディーゲームクリエイターを支援する「iGi indie Game incubator」の第4期生募集を12月15日より開始―12月19日に説明会も開催 GO!
VR映画「機動戦士ガンダム: 銀灰の幻影」制作決定 フランスの制作会社と共同で GO!

スクエニインサイダー取引事件で有罪判決を受けた社員の知人が490万円の課徴金…社外の人物も不正に取引 GO!
バンダイナムコでまた内部不正 廃棄庫から商品持ち出し、8700万円の利益 8年間気付かず GO!

前回のコメント

・クラスやメソッドの選定基準がよくわからなかったのでそこの疑問が晴れました。

 何よりです。

・ペースも前回と同じくよかったです。

 了解です。リアクション感謝します。

講義メモ 後半

p.58 引数と戻り値

・Debug.Logはメソッドと呼ばれる処理を示す構文の一つ
・C言語などでは関数と呼んでいたが、C#/Javaなどのオブジェクト指向言語ではメソッドといいクラスの中におく
・メソッドは「0個以上の情報を受け取って何かを行い0または1個の情報を返す」仕組み
・Debug.Logの場合、1個の情報を受け取って何かを行い0個の情報を返す(何も返さない)
・この情報を受け取る仕組みを引数といい、メソッド名の後にカッコで示す
・引数のないメソッドもある
・1個の情報を返すメソッドでは、何型で返すのかを決める必要がある。これを戻り値型という
※ Debug.Logの「Debug」はLogメソッドが所属するクラス名(Unityが提供)
・平方根を返すMathf.Sqrtメソッドがあり、戻り値型はfloat、引数は1個でfloat型
 https://docs.unity3d.com/ja/2021.2/ScriptReference/Mathf.Sqrt.html
・このことを「戻り値型 メソッド名(引数型,…)」とも表現する 例:float Mathf.Sqrt(float)
・なお、引数型が実数(floatやdouble)の場合、整数を指定すると自動的に変換される
 例: Mathf.Sqrt(16) は Mathf.Sqrt(16.0)とみなされて4.0が返される
・数式にはメソッドの呼び出しを含むことができる
 例: float f = Mathf.Sqrt(16.0) + 1.0; //5.0になる
・引数でメソッドの呼び出しを含むことができる
 例: Debug.Log(Mathf.Sqrt(16.0)); //4を表示
※ Mathf.Sqrtの「Mathf」はSqrtメソッドが所属するクラス名でUnityが提供
※ なお、Unityが提供するクラスを利用するために「using UnityEngine;」を指定している

ミニ演習 mini059

・float型のパブリック変数で実数を受け取って、平方根を表示しよう

作成例

using UnityEngine;
public class mini059 : MonoBehaviour {
    [Header("実数を入力してください")]
    public float a = 0;
    void Start() {
        Debug.Log("平方根は" + Mathf.Sqrt(a)); //メソッドを呼んで連結
    }
    void Update() {}
}

p.59 複数の引数を渡す

・メソッドに渡すことのできる引数の型、数、順序は定義で決まっており、定義されていない引数の指定を行うとエラーになる
※ C#やUnityが提供するメソッドの引数の型、数、順序はオフィシャルドキュメントで確認できる
※ 同じ名前で引数の型、数、順序が異なるものを複数定義できる(オーバーロードという)
※ Mathf.Maxメソッドは引数をいくつでも指定できる特別なメソッドになっている(可変引数)
・複数の引数を指定できる場合はカンマ区切りで並べると良い
・Mathf.Maxの戻り値型はfloat、引数型はすべてfloatだが、整数値を指定でき、戻り値をint型変数に代入できる
※ カンマ区切りにおいてはカンマの後ろに空白を置くというチームルールにしていることがある

p.59 Chap1_12_1

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

public class Chap1_12_1 : MonoBehaviour {
    void Start() {
        int value = Mathf.Max(10, 40, 20, 30); //最大値を得る
        Debug.Log( value );
    }
    void Update() {
        
    }
}

アレンジ演習:p.59 Chap1_12_1

・3つのfloat型実数をパブリック変数で受け取って最大値を表示するようにしよう

作成例

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

public class Chap1_12_1 : MonoBehaviour {
    public float a, b, c;
    void Start() {
        float value = Mathf.Max(a, b, c); //最大値を得る
        Debug.Log( value );
    }
    void Update() {
        
    }
}

p.060 メソッドの「.」の前にあるものは何?

・前述のとおり、Debug.Logの「Debug」はLogメソッドが所属するクラス名で、これはUnityが提供するクラス
・前述のとおり、Mathf.Sqrtや、Mathf.Maxの「Mathf」はMaxメソッドが所属するクラス名で、これもUnityが提供する
 クラス
・メソッドは(C言語などの関数とは異なり)クラスに所属する
・なお、Start()やUpdate()もメソッドで、所属するクラス名がChap1_12_1ならば、フル名はChap1_12_1.Start()や
 Chap1_12_1.Update()となる。
※ よって、実質的にはUnityシステムがクラス名.Start()を呼び出してくれている
※ なお、クラスが異なれば同名のメソッドを持つことができるので便利&注意

p.061 静的メソッドとインスタンスメソッド

・クラスは多数のメソッドを持つ部品箱的なものもあるが、基本的にはメソッドとデータを持つ設計図のイメージでもある。
・汎用的に使われるメソッドは、部品箱的なクラスにおいて「クラス名.メソッド名」で呼び出せるように静的メソッド
 として定義する。
・Debug.Logメソッド、Mathf.Sqrtメソッド、Mathf.Maxメソッドはすべて静的メソッド
※ 静的メソッドは定義において「static」をつけて区別する
・対して、メソッドとデータを持つ設計図のイメージになっているクラスでは、メソッドとデータをオブジェクトとして
 まとめて扱いたいので「オブジェクト名.メソッド名」で呼び出す。
・このようなメソッドをインスタンスメソッドといい、こちらが標準的存在
※ 参考:インスタンスメソッドの例(C#のArrayListクラス)
 ArrayList monsters = new ArrayList(); //モンスターを格納するリストを生成
 monsters.Add("ヴェルドラ"); //monstersリストにAddメソッドで追加
 monsters.Add("リムル"); //monstersリストにAddメソッドで追加
 ArrayList players = new ArrayList(); //プレイヤーを格納するリストを生成
 players.Add("私"); //playersリストにAddメソッドで追加
※ 上記のように本来のメソッドは「何に」をつけて示すもので、静的メソッドは例外的。
※ クラスはプログラマが定義でき、中にメソッドを記述するときに、インスタンスメソッドにするか、
  静的メソッドにするか判断できる

提出:アレンジ演習:p.59 Chap1_12_1

講義メモ

・p.57 Chap1_11_1から

.56 型を変換する

・範囲の大きい同種の型に代入する場合は、自動的に暗黙の型変換が行われる
 例: int i = 5; long a = i; //暗黙の型変換でlongになる
・整数型から実数型に代入する場合は、自動的に暗黙の型変換が行われる
 例: int i = 5; double a = i; //暗黙の型変換でdoubleになる
・実数を整数型に代入する場合は、明示的な型変換(キャスト)が必要で「(型名)」を前置する
 ※ これをキャスト演算子ともいう
 例: double a = 3.14; int i = (int)a;  //int型にキャストしてからなら代入可能で3になる
・実数リテラルを整数型にキャストすることも可能
 例: int i = (int)3.14;  //int型にキャストしてからなら代入可能で3になる
・実数から整数型にキャストすると小数点以下切捨てになる(四捨五入ではない)
・文字列型以外の各型を文字列型に変換するには、""(0文字の文字列)に「+」で連結すると良い
 例: int i = 365; string s = "" + i; //文字列"365"になる

p.57 Chap1_11_1

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

public class Chap1_11_1 : MonoBehaviour {
    void Start() {
        int seisuu = (int)3.5; //小数点以下切捨てでint変換
        string text = "" + 110; //文字列変換で"110"になる
        Debug.Log( seisuu + text  ); //加算ではなく連結で"3110"になる
    }
    void Update() {
        
    }
}

ミニ演習:mini057b

・3の整数の平均値を実数で表示したい
・public変数a、b、cを定義し、合計をdoubleにキャストしてから3で割って平均を得よう

作成例

using UnityEngine;
public class mini057b : MonoBehaviour {
    public int a = 1, b = 2, c = 3;
    void Start() {
        Debug.Log((double)(a + b + c) / 3);
    }
    void Update() {}
}

別解

using UnityEngine;
public class mini057b : MonoBehaviour {
    public int a = 1, b = 2, c = 3;
    void Start() {
        Debug.Log((a + b + c) / 3.0); //整数÷実数になる
    }
    void Update() {}
}

ミニ演習:mini057c

・西暦を受け取って何世紀か答えよう
・例:20世紀は1901年から2000年まで
・入力時にわかりやすいようにUnity側のパブリック変数の上にコメントを表示できる
・書式: [Header("コメント")] ※パブリック変数の定義のすぐ上に単独行で置くこと
・ヒント: 世紀 = (年 - 1) / 100 + 1

作成例

using UnityEngine;
public class mini057c : MonoBehaviour {
    [Header("西暦を入力してください")]
    public int a = 1901;
    void Start() {
        Debug.Log((a - 1) / 100 + 1 + "世紀です"); //計算後に連結
    }
    void Update() {}
}

参考:2つ以上のパブリック変数コメントも可能

using UnityEngine;
public class mini057c : MonoBehaviour {
    [Header("西暦を入力してください")]
    public int a = 1901;
    [Header("令和の和暦を入力してください")]
    public int b = 1;
    void Start() {
        Debug.Log((a - 1) / 100 + 1 + "世紀です"); //計算後に連結
        Debug.Log("西暦" + (b + 2018) + "年です"); //計算後に連結
    }
    void Update() {}
}

今週の話題

販売本数ランキング 今回トップも「スーパーマリオブラザーズ ワンダー(Switch)」GO!
2024年リリースの「Unity 6」公開…パフォーマンス大幅向上やAIサポートの強化―AIツール「Unity Muse」、開発管理ツール「Unity Cloud」も早期アクセス開始 GO!
IP戦略が奏功の任天堂、過去最高益を達成―次なる一手『ゼルダの伝説』映画化にも本気【ゲーム企業の決算を読む】GO!
『RPG Maker Unite』で3Dダンジョンが作成できる公式DLC「アドオン 3Dダンジョン」配信!簡単に2Dと3Dの切り替えも可能、日本語チュートリアル映像も公開 GO!
米大学で『ゼルダの伝説 ティアキン』を使った機械設計のコースが開設…ゲーム内で乗り物をデザインし単位を貰う GO!
ホロライブの二次創作ゲームブランド「holo Indie」立ち上げ、有償配布をサポートへ!近日中に第1弾『ホロパレード』も配信 GO!
アトラス、2024年4月に初任給を30万円へ。社員の平均年収15%引き上げも実施―グローバル展開の好調を反映 GO!

一見、あのPS作品の”続編”がSteamに?しかし実態は…熱意溢れすぎたユーザーによる勝手なナンバリング二次創作―目的は「SIEの気を引くこと」か GO!
またもや『原神』リーク者に鉄槌!Xで配信前キャラを漏らしたユーザーに開示請求実施へ GO!
どんなゲームが”インディーゲーム”?「The Game Awards」のノミネート一覧発表きっかけに「どこからがインディーか」議論が勃発 GO!

前回のコメント

・変数の代入がプログラミングしている感じが出ていてこれからこういう覚えているものの組み合わせでプログラミングを描いていく作業が増えていきそうでとても楽しみです。

 楽しんでいただけましたら幸いです。

・ペースは問題なかったです

 了解です。リアクション感謝します。

・型の変換の辺りは少し難解に感じました
 テキストを詠み込む等して見直しておきます

 是非。
 疑問点がありましたら、過去の講義分を含めていつでも解説をリクエストしてください。

講義メモ 後半

p.56 組み込み型とは

・doubleは実数を、stringは文字列を扱うためのデータ型で、C#があらかじめ提供しているので、組み込み型ともいう
・参考:4章以降で学習するクラスを用いると、プログラマが型を定義できる。これをユーザ定義型という
・実数型:正式には浮動小数点数型といい、doubleとfloatがある
 ① double:倍精度浮動小数点数型・1個64ビット。実数値のデフォルト型
 ② float :単精度浮動小数点数型・1個32ビット。メモリを節約できるのでUnity向き
・整数型ー符号有:負の数も扱える
 ① int:汎用整数型・1個32ビット。整数値のデフォルト型。約-21億から21億まで。
 ② long:長整数型・1個64ビット。intの範囲を超える整数値用
 ③ short:短整数型・1個16ビット。メモリを節約できる。-32768~32767
 ④ sbyte:符号付きバイト型・1個8ビット。メモリをさらに節約できる。-128~127
・整数型ー符号無:0と整数のみなので、正の数の範囲が上記①~④の倍になる
 ① uint:符号無汎用整数型・1個32ビット。0から約42億まで。
 ② ulong:符号無長整数型・1個64ビット。uintの範囲を超える整数値用
 ③ ushort:符号無短整数型・1個16ビット。メモリを節約できる。0~65535
 ④ byte:バイト型・1個8ビット。メモリをさらに節約できる。0~255
・各型の範囲はC#が提供する定数で得られる。最大値は「型.MaxValue」最小値は「型.MinValue」

ミニ演習:mini056

・各型の最大値「型.MaxValue」最小値「型.MinValue」を確認しよう

作成例

using UnityEngine;
public class mini056 : MonoBehaviour {
    void Start(){
        Debug.Log("double Max:" + double.MaxValue + " Min:" + double.MinValue);
        Debug.Log("float  Max:" +  float.MaxValue + " Min:" +  float.MinValue);
        Debug.Log("int    Max:" +    int.MaxValue + " Min:" +    int.MinValue);
        Debug.Log("long   Max:" +   long.MaxValue + " Min:" +   long.MinValue);
        Debug.Log("short  Max:" +  short.MaxValue + " Min:" +  short.MinValue);
        Debug.Log("sbyte  Max:" +  sbyte.MaxValue + " Min:" +  sbyte.MinValue);
        Debug.Log("uint   Max:" +   uint.MaxValue + " Min:" +   uint.MinValue);
        Debug.Log("ulong  Max:" +  ulong.MaxValue + " Min:" +  ulong.MinValue);
        Debug.Log("ushort Max:" + ushort.MaxValue + " Min:" + ushort.MinValue);
        Debug.Log("byte   Max:" +   byte.MaxValue + " Min:" +   byte.MinValue);
    }
    void Update() { }
}

p.56 組み込み型とは(つづき)

・char:文字型。1文字分の情報で16ビット。文字リテラル(「'」で1文字を囲んだもの)を代入できる
・string:文字列型。0文字以上の文字の並びの情報で大きさはない。文字列リテラル(「"」で0文字以上を囲んだもの)を代入できる
・bool:論理型。1ビット分の情報。真偽値リテラルであるtrueとfalseを代入できる(後述)
 ※ 2進数の1と0に該当するが、C/C++のように0や1で代用することはできない

参考:その他の組み込み型と.NET型

・誤差を極力減らしたい場合(例:金銭計算)はdouble型の代わりにdecimal型を用いることができる。
 1個128ビットで、decimal型実数を代入して用いるので、特殊用途。
・各型には、C#の基盤である.NETフレームワークで規定している型名「.NET型」があり、エラーメッセージなどに
 用いられる。基本的には「System.型の名の先頭を大文字にしたもの」だが、下記の例外がある
 int ⇒ System.Int32、long ⇒ System.Int64、short ⇒ System.Int16、float ⇒ System.Single
 uint ⇒ System.UInt32、ulong ⇒ System.UInt64、ushort ⇒ System.UInt16、
 bool ⇒ System.Boolean

p.56 型を変換する

・範囲の大きい同種の型に代入する場合は、自動的に暗黙の型変換が行われる
 例: int i = 5; long a = i; //暗黙の型変換でlongになる
・整数型から実数型に代入する場合は、自動的に暗黙の型変換が行われる
 例: int i = 5; double a = i; //暗黙の型変換でdoubleになる
・実数を整数型に代入する場合は、明示的な型変換(キャスト)が必要で「(型名)」を前置する
 ※ これをキャスト演算子ともいう
 例: double a = 3.14; int i = (int)a;  //int型にキャストしてからなら代入可能で3になる
・実数リテラルを整数型にキャストすることも可能
 例: int i = (int)3.14;  //int型にキャストしてからなら代入可能で3になる
・実数から整数型にキャストすると小数点以下切捨てになる(四捨五入ではない)

ミニ演習:mini057

・パブリック変数で実数を受け取ってint型の変数にキャストして代入し、その値を表示しよう

作成例

using UnityEngine;
public class mini057 : MonoBehaviour {
    public double num;
    void Start() {
        int i = (int)num; //得た実数値をint型にキャストして代入
        Debug.Log(i);
    }
    void Update() { }
}

p.56 型を変換する(つづき)

・文字列型以外の各型を文字列型に変換するには、""(0文字の文字列)に「+」で連結すると良い
 例: int i = 365; string s = "" + i; //文字列"365"になる

参考:数字列から整数/実数型への変換

・数字のみの文字列を整数に変換するにはC#が提供している int.Parse(文字列)を使うことができる
 例: string s = "365"; int i = int.Parse(s); //整数365になる

提出:ミニ演習:mini057