Unity勉強記録

Unityとプログラミングの勉強の記録。

3/29,30 倉庫番

使用テキスト

倉庫番  コガネブログさん

 

進度

倉庫番

 

プログラミング

 

Unityマニュアル

 

Unityスクリプト

 

TextAssetクラス

TextAsset - Unity スクリプトリファレンス

→テキストファイルのデータは、このクラスで扱うことができる。

 

TextAsset.text

public string text;

TextAsset.text - Unity スクリプトリファレンス

→テキストファイルにある文字列をすべて取得する。

 

Vector2Int構造体

Vector2Int - Unity スクリプトリファレンス

→Int型で表現されたベクトルの構造体?

 Vector2は中身がfloatだけど、これはたぶんIntリテラルで作られる。

 たぶん1.5とか3.43とかがベクトルの値になることはなくて

 1とか3、-3とかの整数がベクトルの値になる。

 

 

 

C#

Char型(Charクラス)

→猫C#p43

→文字1文字の値を代入できる。

→文字リテラルはシングルクォート’で囲む。

→改行コード '\r'  と'\n' 

 

String型(Stringクラス)

→猫C#p62

→文字列を代入できる。Charは文字。

→文字列リテラルはダブルクォート”で囲む。

→String型とstringキーワードの違い

 →https://kuroeveryday.blogspot.com/2014/09/string.html

 →みんな気になるC#のstringとStringの違い。

 

String.Split

public string[ ] Split(string separator,StringSplitOptions options);

public string[ ] Split(Char separator,StringSplitOptions options);

オーバーロードあり

→★https://www.sejuku.net/blog/44242

String.Split Method (System) | Microsoft Docs

C#の関数。

→Stringに対して引数separatorがあるところで分割し

 (Stringの中のseparator文字自体は戻り値に入らない)

 分割されたStringを格納した配列を返す。

→引数の配列separatorの格納要素が複数あるとき、そのすべてが区切り文字として

 扱われる。

 例

  textFile.text.Split(new{'a','b','\r','\n'});

  // テキストファイルの文字列のなかで、aかbか \r か \n があるところで区切る。

→テキストファイルのなかで、改行されているところには、\rか\nか\r\nの3つのうちどれかの文字コードが入っていると考えていい。

 改行でSplitしたいときは、その3つを指定すればいい。

→戻り値の配列で、空の配列要素を省略したいとき  

 System.StringSplitOptions.RemoveEmptyEntries列挙子を指定。

 (System名前空間のStringSplitOptions列挙型のRemoveEmptyEntries列挙子)

 空の配列要素を省略しないで含めるときは、System.StringSplitOptions.None列挙子と指定する。

→引数separatorがCharの場合は、System.StringSplitOptions列挙型を書くのを省略できる。

 省略した場合は、System.StringSplitOptions.Noneが適用される。

 

配列の型推論

→配列初期化子newを使って配列を定義するときに、クラス型を省略できる。

→何かの関数で引数に配列を渡すときにも、要素を一緒に書いている場合は、newのあとのクラス型を省略できる。

→例

  var a = new{1,2,3}; 

   // int a = new int{1,2,3};

→例 (引数に配列)

  textFile.text.Split( new{ ’ , ' , '\n','/r'});

   // Splitメソッドの引数に、クラス型を省略して初期化した配列を渡せる。

 

int型をenum型に変換

enum型名でキャストするだけ。

【C#入門】enum(列挙型)とint型を相互に変換する方法 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

→例

  (Enum名 ) intの変数orリテラル

  

int.Parse

public staic int Parse(string s,・・・)

Int32.Parse Method (System) | Microsoft Docs

→引数に渡された数字の文字列をint型に変換する。

→本当は Int32.Parseとも書ける。

→いつも使っていた「int」は Int32構造体のエイリアス(別名)らしい。

 

エイリアス

[C#] エイリアスでクラスや名前空間に別名を付ける方法 │ Web備忘録

C# Tips −intとInt32はどう違う?−

→★C# の int はオブジェクトなのか - Qiita

→★stringとString、intとInt32、違いは? | C#のいろいろ

 

 

2次元配列

配列 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

2次元配列

→配列を格納した配列。

→int[,]  array = new int[3,5];   5つの要素数を持つ配列を、3つ格納できる2次元配列。

 

f:id:five_Y:20190330020927p:plain


 

Dictionaryクラス

→★★C#のDictionaryを使ってみる | Unityを使った3Dゲームの作り方(かめくめ)

  (↑Dictionary理解)

→★Unity C# DictionaryとListの使いかた(ざっくり) - 週刊SleepNel新聞

  (↑Dictionary使用例)

C#のDictionary【Unity, C#】 - Qiita

  (↑Dictionaryクラス操作方法)

→配列は、要素数を予め決めておく必要がある。

→Listは、要素数の追加、削除ができる。

C#のListをUnity付属のMonoDevelopで使ってみる | Unityを使った3Dゲームの作り方(かめくめ)

→Dictionaryはキーと要素をセットで格納でき、キーで要素を取り出せる。

→Dictionary<キーのクラス型、要素のクラス型>  d = new Dictionary<キーのクラス型、要素のクラス型>();

連想配列ともいうらしい。

 

continueキーワード

continue ステートメント - C# リファレンス | Microsoft Docs

→while,for,foreach文などの反復処理のブロックの中で使う。

→continueがあるところで、そのループ処理を抜け、次のループ処理に移る。

 

 

用語

row

: 行 (行は横、ぎょうれつのぎの書き始めは横棒で覚える)

columns  //columではなく、column

: 列 (列は縦、れつのれの書き始めは縦棒で覚える)

https://spaicy.jp/how-to-remember-the-rows-and-columns

 

 

 

 

3/25月 全方位25.26

使用テキスト

全方位シューティング  コガネブログさん

 

進度

全方位シューティング

第25回(レベルが上がったらパワーアップ)

第26回(ゲームのビルド)

 

プログラミング

数値をレベルによって上げたいとき

→Mathf.Lerpを使う! 

→Mathf.Lerp(最低値、最高値、t)  // t =(レベル-1)/ (MAXレベル -1)

→レベル1のとき、最低値になるように t では (レベル - 1)する。

 こうすることで、レベルが1のとき、t=0となって最低値を取る。

 

 

 

 

Unityマニュアル

 

Unityスクリプト

 

Mathf.RoundToInt

public static int RountToInt(float f);

Mathf.RoundToInt - Unity スクリプトリファレンス

→引数のfloat f に最も近い整数intを返す。

 

C#

 

用語

 

 

 

 

 

3/23土 全方位22.23.24.25

使用テキスト

全方位シューティング  コガネブログさん

 

進度

全方位シューティング

第22回(レベルの表示)

第23回(ゲームオーバーの表示)

第24回(敵の出現頻度を上げる)

第25回(レベルが上がったらパワーアップ)

 

 

プログラミング

レベル表示

Update

 テキストコンポーネントのTextパラメータ=プレイヤーのレベル(Int). ToString();

 

ゲームオーバー表示

Update

 ゲームオーバーテキスト.SetActive(!プレイヤーのアクティブ);

  //!によって

    プレイヤーのアクティブがfalseのときに、trueになって

    プレイヤーのアクティブがtrueのときに、falseになる。

 

★Publicフィールドに置く変数の型の選択

→publicなフィールド変数は、Inspectorでその中身を指定できる。

→publicなフィールド変数には、Inspectorで指定したゲームオブジェクトの、publicフィールドで定義した型と同じコンポーネントインスタンスが渡される。

→例

  Publicフィールドで以下を定義。

   public  Rigidbody gameObjectR;

   public Transform gameObjectT;

  InspectorでgameObjectA,gameObjectTにゲームオブジェクトAを指定すると、

   gameObjectRには、ゲームオブジェクトAのRigidbodyコンポーネントインスタンス

   gameObjectTには、ゲームオブジェクトAのTransformコンポーネントインスタンス

  が入る。

Publicフィールドの型をどうするかは、使いたい関数やアクセスしたいパラメータによって決めるといい。

 →例

  レベル表示のときは、

   テキストゲームオブジェクトのTextコンポーネントのtextパラメータにアクセスしたかったので、

   publicフィールドでの型は

    public Text m_levelText;

   と定義すればいい。

   こうすることでm_levelText.text = player.m_level.ToString();とTextコンポーネントのtextパラメータにスムーズにアクセスできる。

  ゲームオーバー表示のときは、

   テキストゲームオブジェクトに対して、GameObject.SetActive関数を使いたかったので、

   publicフィールドでの型は、

    public GameObject m_gameOverText;

   と定義すればいい。

   こうすることで、m_gameOverText.SetActive(!player.gameObject.activeSelf);というふうに、m_gameOverText(GameObject型)から、SetActive関数を呼ぶことができる。

 

     

 

敵の出現頻度を上げる。

→今までは、以下のように「固定されたm_Interval」で敵の出現間隔を調整していた。

 Update

  m_timer += Timer.deltaTime;

  if( m_timer < m_interval) return;

  m_timer=0;

  敵をInstantiate。

→このintervalを可変にし、ゲームの経過時間によって低い値になるようにする。

    interval = Mathf.Lerp(intervalの最大値、intervalの最小値、t);

 このときのtをゲームの経過時間によって、1に近づければよい。

   t = ゲームの経過時間/ゲームのMAX経過時間

 とすると、

 ゲームの経過時間が、ゲームのMAX経過時間に近づくにつれ、tは1に近づく。

 ゲームのMAX経過時間を60にすると、ゲームの経過時間が60秒すぎたとき、

 intervalは設定された最小値になる。

 

 

 

 

 

Unityマニュアル

 

Unityスクリプト

 

Int.ToString

public override string ToString();

public string ToString (string format);  etc..

Int32.ToString Method (System) | Microsoft Docs

→「Intのリテラル.ToString()」と使うことで、そのIntの数値のString型を返す。

 

C#

 

用語

elapsed: elapse(経過する)の過去形、イラプス

 

 

 

 

3/22金 全方位18.19.20.21

使用テキスト

全方位シューティング  コガネブログさん

 

進度

全方位シューティング

第18回(レベルアップ処理)

第19回(BGM)

第20回(SE)

第21回(HPゲージ、経験値ゲージ)

 

 

プログラミング

 

if() return;をうまく使う。

・Player.AddExp関数

  プレイヤーの経験値 += GemEXP;

  if(プレイヤーの経験値 < レベルアップに必要な経験値) return;

  レベルアップ処理;

  // if(プレイヤーの経験値 > レベルアップに必要な経験値) { レベルアップ処理;}と

  してしまうのではなく、上のようにする。

・Enemy.OnTriggerEnter2D関数

 private void OnTriggerEnter2D( Collider2D collision){

  if( collision.name.Contains("shot"))

  {

   Destroy( collision.gameObject);

   m_hp--; // EnemyのHPをへらす

   if( 0 < m_hp) return; //EnemyのHPが0より大きいとき return;

   Destroy( gameObject); // Enemyを削除する。

   // if( m_hp < 0) { Enemy削除処理);とするのではなく、上のようにする。

  }

 }

・敵の出現間隔のコード、EnemyManager.Update関数内

 void Update(){

  m_timer += Time.deltaTime;

  if( m_timer < m_enemyInterval) return; //経過時間<エネミーインターバルのときreturn

  m_timer =0;

  敵をInstantiateする処理。

 }

 

スクリプトでUnityのUIオブジェクトを扱うときは、「using UnityEngine.UI」する。

 

HPゲージ

→HPゲージの枠

 →子 HPゲージ  ImageTypeをFilledにする。

→Filledにした画像は、image.fillAmountプロパティで、表示する画像の割合をスクリプトで変更できる。

→Updateメソッド内で、

 HPゲージのImage.fillAmount =

   (float) 現在のプレイヤーの体力 / プレイヤーのMAX体力

 とすることで、HPゲージの増減を反映できる。

 

EXPゲージ

→HPゲージと同じように作る。

→Updateメソッド内で、

 EXPゲージのImage.fillAmount =(float)

  (現在のEXP ー 前のレベルアップに必要な経験値) / (レベルアップに必要な経験値ー前のレベルアップに必要な経験値)

 とする。

 

Unityマニュアル

 

ImageコンポーネントのImageTypeパラメータ  3D2Dp265

Simple→指定された画像をそのまま表示。

Silced→画像を上下左右、中央の9つの領域に分解し、それぞれに違う拡大を適用したあと、合成する。画像の端の部分がぼやけることなく、画像を拡大できる。パネルやウィンドウなどに使う。

Tiled→元の画像を、大きさを変えずに、Imageオブジェクトの領域文並べて表示する。背景などに使う。

Filled→指定された画像の一部を表示する。HPゲージなどに使える。

     Fill Methodパラメータで 表示の仕方(Horizonal:横,Vertical:縦,Radial:弧)を変更できる。

     スクリプトでImage.fillAmountに0~1の値を入れることで、表示する割合を変更できる。

 

Unityスクリプト

 

AudioSource.PlayOneShot

public void PlayOneShot(AudioClip clip, float volumeScale=1.0F);

→ AudioSource.PlayOneShot - Unity スクリプトリファレンス

→引数のAudioClipを一回再生する。

 

Object.FindObjectOfType

public static Object FindObjectOfType( Type type );

Object.FindObjectOfType - Unity スクリプトリファレンス

→Staticメソッドだが、PlayerクラスはObjectクラスを継承しているので

 前になにもつけずに FindObjectOfType();で使える。

 

Image.fillAmountプロパティ

public float fillAmount;

https://docs.unity3d.com/ja/current/ScriptReference/UI.Image-fillAmount.html

→ImageコンポーネントでImageTypeをFilledにした画像の表示割合。

→0~1の値を入力でき、0で表示なし、1で完全に表示する。

 

 

C#

 

用語

Gauge : ゲージ

Hud : ゲームのHUD表示のこと。ハッドと発音。Head-Up-Displayの略。

ゲームでの「UI」と「HUD」の区別

  

 

 

 

 

3/20水21木 全方位16,17

使用テキスト

全方位シューティング コガネブログさん

 

進度

全方位シューティング   第16回(敵を倒したら宝石を落とす)

全方位シューティング 第17回(プレイヤーが近づいたら、宝石を追尾させる)

 

プログラミング

LINQを使うときは、「using System.Linq;」を書く。

 

敵を倒したとき、敵と同じEXPの宝石を落とす処理。

 while( 0 < 敵EXP){

  敵EXP以下の宝石を選んで生成;

  敵EXP ー= 生成した宝石EXP;

 }

プレイヤーが宝石に近づいたら、引き寄せる処理。

 Update

  プレイヤーが一定の距離まで近づいたら、宝石の追尾フラグをON。

  追尾フラグがONのとき、宝石からプレイヤーへの方向ベクトルを取得し

  宝石のlocalPositionに方向ベクトルを+=し、追尾させる。

  宝石の速度+=宝石の加速度

  宝石がプレイヤーにあたったら自身をDestroy。

 

→VisualStudioで、関数をハイライトしてF12を押すと、その関数の定義がわかる。

→レファレンスソースで、関数の定義と中身を知ることができる。

UnityCsReference/Vector3.cs at master · Unity-Technologies/UnityCsReference · GitHub

 

・VisualStudioコード整形  CTRL+K+D。 

 

Unityスクリプト

 

Vector3.Distance

public static float Distance(Vector3 a, Vecror3 b );

Vector3.Distance - Unity スクリプトリファレンス

→ベクトルaとベクトルbの距離を返す。

 

GameObject.activeSelf

public bool activeSelf;

GameObject.activeSelf - Unity スクリプトリファレンス

【Unity】GameObjectのactive状態を取得するときの注意点

→ゲームオブジェクトのローカルのアクティブ状態

→ゲームオブジェクトが親のゲームオブジェクトの状態にかかわらず、アクティブかどうかを読み取る。

→親のゲームオブジェクトがfalseでそのゲームオブジェクトが表示されていなくても、そのゲームオブジェクトがtrueならtrueを返す。

      

Vector3.Normalize

public void Normalize();

public static Vector3 Normalize(Vector3 value);

UnityCsReference/Vector3.cs at master · Unity-Technologies/UnityCsReference · GitHub

→Vector3.Normalizeメソッドには、インスタンスメソッドとスタティックメソッドの2つの定義がある。

インスタンスメソッドのほうは、公式リファレンスには載っていない。

 リファレンスソースには載っている。

→Vector3.Normalizeメソッド→元のベクトル自体を単位ベクトルにする。

→Vector3.nomalizedプロパティ→元のベクトルの単位ベクトルを返す(元のベクトルは変わらない)

 

Transform.localPosition変数

→親を指定していない場合、localPositionはpositionと同じ。

 

 

 

C#

IEnumerable.ToArray();

【C#,LINQ】ToArray~シーケンスから配列を作りたいとき~ - うら干物書き

IEnumerable.ToArrayメソッド - プログラマーな日々

→Listクラスや IEnumerableのデータに対してToArrayメソッドを使うと、その格納されたデータ型の配列を作って返す。

→ToArrayメソッドは、IEnumerableインターフェースを継承したクラスで使えるメソッド。

 

データ.LINQメソッド(デリゲート)のデリゲートの引数は、

ラムダ式で書くと

( 型名 value ) => { valueを使った条件 、処理}

このとき、引数の 型名 value には、「そのデータの格納された要素が入る」

valueに、データの要素が一つずつ入って、valueを使った条件にとおされる。

それがデータの要素数分繰り返される。

 

 

 

 

 

 

 

 

3/18.19月火 インターフェース・LINQ

使用テキスト

未確認飛行C

進度

インターフェースあたり

C#

クラスについて、メンバとフィールドの違いなど

プロパティ?フィールド?メンバー?C#のクラス構造のおさらい - Qiita

 

継承

継承 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→派生クラスは、基底クラスのメンバを明示しなくても受け継ぐ。

 明示して基底クラスのメンバを再定義してしまうと、それは基底クラスのメンバではなく

 派生クラスのメンバになる。(基底クラスのメンバの隠蔽、再定義時にはnewが必要)

→インターフェースを継承してときの、インターフェースの抽象メソッド、抽象プロパティの実装は、基底クラスのメンバの隠蔽とは関係なし。

→派生クラスのインスタンスは、基底クラスの変数に代入できる。逆はだめ。

 

インターフェース

インターフェース - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→クラスの規約を定めたもの。interfaceキーワードを使って作る。

  インターフェース→規約

  クラス→規約の実装

→インターフェースで宣言したメソッド・プロパティは、すべて明示しなくてもpublic abstractになる。

 abstract修飾子がついたメソッド・プロパティは、抽象メソッド、抽象プロパティという。

→標準クラスライブラリのインターフェースは、マイクロソフトが用意している

 凡庸性の高いインターフェースのこと。System.Collections.Generic名前空間にある。

 →System.Collections.Generic Namespace | Microsoft Docs

 

インターフェースのできた理由

[雑記] 多重継承できない理由 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→の一番下の文章。

 

IEnumerableインターフェース 

→コレクション(配列、連結リスト、探査木)内の要素へのアクセスの規約を定義したインターフェース。

foreach - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→foreach文の実態は、IEnumerableインターフェースを介した要素へのアクセス。

→なのでIEnumerableインターフェースを実装しているすべてのコレクションクラスの要素を読みだせる。

 

★インターフェースの使い方、実装

→★010. インターフェースとは[[.NET(C#/VB)]オブジェクト指向] - (>ω<)/わふー

→★C#の主要インターフェース解説:インターフェースとは - がりらぼ

→★インターフェースの何が嬉しいのか - Qiita

→インターフェース型   i =  new  インターフェースを継承したクラス名A();

 ができる。

→インターフェース型   i =  new  インターフェース型();

 はできない。

→インターフェースを実装したクラスは、必ずインターフェースの機能(メソッド)を実装しなければならない。「C#ではインターフェースの機能の実装を必須化することで、インターフェースに信頼性をもたせている。」

→インターフェースを活用すると、インターフェースを継承したクラスの内部処理を意識せずに、インターフェースの機能(ふるまい)だけを意識して使える。

 例

   IReadインターフェース(Read機能をもったインターフェース)

   IRead  file = IReadインターフェースを継承したクラスAまたはクラスBのインスタンス

   file.Read();  // クラスA、BでのReadメソッドの実装内容を意識せずに、Readメソッドが使える。

     

 

抽象メソッド

抽象メソッド、抽象クラス - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

 

プロパティ

プロパティ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

005.4.プロパティとは[[.NET(C#/VB)]オブジェクト指向] - (>ω<)/わふー

→出し入れできるメソッドがついた変数のようなもの。

→get-onlyのプロパティでは、expression-bodied形式でプロパティを定義できる。

 例

  public double Radius => Math.Sqrt(X*X + Y*Y);

    // expression-bodied形式で定義したプロパティは、get-onlyプロパティになる?

 

expression-bodied形式

式形式のメンバー - C# プログラミング ガイド | Microsoft Docs

→ラムダ演算子=>を使って、メソッドやプロパティの本体を式に組みこむ記述形式? 

→メンバーに対するロジックが「単一の式」のときに、expression-bodied形式で記述できる

 例-プロパティのGet、Setアクセサーを式形式で書いたもの。

  public string Name

  { 

    get => locationName;

    set => locationName=value;

  }

 

 

イテレータブロック

イテレーター - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

イテレータブロックで作られたメソッドは、IEnumeratorインターフェースを実装したクラスを返す。yield returnキーワード のあとに指定された要素を格納したIEnumeratorインターフェースを実装したクラスを返す

イテレータブロックの決まり。

 ・戻り値の型が以下のいずれか

  System.Collections.IEnumerator

  System.Collections.Generic.IEnumerator<T>

  System.Collections.IEnumerable

  System.Collections.Generic.IEnumerable<T>

 ・returnの代わりにyield returnキーワードを使う。

 ・breakの代わりにyield breakキーワードを使う。

 

匿名型(匿名クラス)

型推論と匿名型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

C#の匿名型について調べてみた - Qiita

匿名型 - C# 入門

→classキーワードを使うことなく、名前無しのクラスを作ることができる。

 匿名クラスは、LINQでデータを渡すときによくつかう。

→匿名クラスのプロパティは、getアクセサーのみの読み取り専用プロパティ。

→定義

  new { プロパティ名 = プロパティの初期化値};

  // 自動的にAnonymousという名前のクラスが作られる。

  // プロパティの型名は明示しない、初期価値で代入した型に自動でなる。

  // 匿名クラスのインスタンスを変数に代入するとき、匿名クラスは名前がないので、

   var キーワードを使って型推論した変数に入れる。

→例

  var mc = new{ PropA = 10,  PropS = "タナカ"};

   // mc変数には、PropAプロパティとPropSプロパティをもった匿名クラスのインスタンスが入る

  Debug.Log( mc.PropA); //10

  Debug.Log( mc.PropS); //タナカ

 

LINQ

→★はじめての LINQ - Qiita

LINQ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

標準クエリ演算子(クエリ式関係) - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

C#でデータ操作できるようにした構文のこと。

→IEnumerableインターフェースを実装しているコレクションクラスに対して使用できる?

→標準クエリ演算子で、データに対して操作できる。

→クエリ構文とメソッド構文どちらの使い方もできる。

→メソッド構文の場合、データに対して、メソッドを使ってデータ操作できるので今までのC#と違いがすくない。

 

LINQメソッド使い方

はじめての LINQ - Qiita

https://www.sejuku.net/blog/56519

→IEnumerableインターフェースを実装しているクラスに対してLINQメソッドは使える。

→例

  var collection = new List<int> { 1,2,3,4,5};

  collection.First();   // コレクションの一番最初の要素を取得するLINQメソッド

  collection.Last(); // コレクションのラストの要素を取得するLINQメソッド

 

★デリゲードを引数にわたすLINQメソッド

はじめての LINQ - Qiita

https://www.sejuku.net/blog/56519

→定義

  IEnumerable継承したクラス.LINQメソッド(デリゲート);

   // デリゲートのところはラムダ式を直に入れる。

・Selectメソッド

→射影、コレクションの要素すべてに加工を施して、その結果を格納したIEnumerableインターフェースを継承したクラスを、IEnumerable型で返す。

→例

  int collection = {1,2,3,4,5};   //配列は、初期化時に限り、new intを省略できる。

  var query = collection.Select(x => x*2);

   // queryには、Selectメソッドによって、加工されたデータをもつIEnumerableが入る。

  foreach( var x in query){

   Console.WriteLine(x);

  }

   // 2,4,6,8,10

・Whereメソッド

→選択、渡された条件がtrueのときの要素を取り出し、それらを格納したIEnumerableインターフェースを継承したクラスを、IEnumerable型で返す。

→例

  int collection = {1,2,3,4,5}; 

  var query = collection.Where( x=> x%2 ==0);  

   // collectionの各要素に対してX%2 ==0 を確かめ、trueのときその要素を格納する

  foreach(var x in query){

   Console.WriteLine(x);

  }

   // 2,4

LINQメソッドの組み合わせ

LINQメソッドはIEnumerable型を返すので、返されたIEnumerable型に対してまたLINQメソッドを使用できる。

→例

  int collection  = {1,2,3,4,5};

  var query = collection

         .Where(x => x%2 ==0)

         .Select(x => x*2);

      // collection.Where(x => x%2 == 0).Select(x => x*2);と書いても良いが、上の書き方が普通。

   foreach(var x in query){

   Console.WriteLine(x);

  }

   // 4,8

 

→WhereやSelect以外にもさまざまなLINQメソッドがある。リンク参照

 

用語

ダックタイピング

その他の用語 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

 

 

 

 

 

 

 

 

3/17日 デリゲート

使用参考書 

未確認飛行C

進度

デリゲート~ラムダ式

C#

デリゲード

デリゲート - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→★https://qiita.com/RyotaMurohoshi/items/740151bd772889cf07de

→メソッドの参照を代入できるクラス型のこと。

→定義したデリゲート型と同じ種類(戻り値引数リスト)の関数を、デリゲート型変数に代入できる。

→すべてのデリゲートの型は、Delegate型から派生する。

 ふつうのクラスのようにDelegate型を継承するのではなく、(明示的にDelegate型を継承できるのはコンパイルとシステムだけ)、「delegateキーワード」を使う。

 そうすることで、Delegate型のサブクラスを作ることができる。

→デリゲート型の変数に、メソッドの参照を代入する方法。

 例

  delegate  int SomeDelegate(int x, int y);

    // SomeDelegate  d = new SomeDelegate(MethodA);

    // ↑のやりかたは、C#1.1までで、今はこの書き方はしない。

    // メソッドからデリゲート型へと暗黙の型変換ができるようになったので

     以下のように書く

  SomeDelegate d = MethodA;

  

  static int MethodA(int x, int y){ return x*y;}

 

→述語としてのデリゲート。デリゲートに委託する関数本体の処理(述語)が決まっていなくても、デリゲート型変数として一旦処理を書くことで、任意の述語に対して対応できるコードを書ける。

 

Func型、Action型

→★https://qiita.com/RyotaMurohoshi/items/740151bd772889cf07de

マイクロソフトが用意しているジェネリックデリゲート型のこと。

→Func<T,TResult> 型  は、T型を引数にとって、TResult型を返すメソッドを参照するデリゲートの型。

 Action<T>型は、T型の引数を取って、戻り値を返さないメソッドを参照するデリゲート型。

 Func系デリゲート型は、戻り値を返すデリゲート型。

 Action系デリゲート型は、戻り値を返さないデリゲート型。

→今までは、delegate  Int  delegateName(int x, int y);  のように引数と戻り値が固定されたデリゲート型を定義して、その変数に、同じ引数と戻り値の関数の参照を入れていたが、

 このジェネリックなデリゲート型を使うことで、その手間が少し省ける?

  例

    delegate int DelegateName(int x, int y);

    DelegateName  dele = (int x, int y) =>{ 関数本体 (処理) } ;

                     ↓

    Func<int, int, int>  dele =  (int x, int y) =>{ 関数本体(処理) };

 

→Func<T,TResult>型、Action<T>型以外にもたくさんある。

 Func<T1,T2,TResult>型  T1T2を引数にとり、TResult型を返すメソッドを参照するデリゲート型

 Func<T1,T2,T3,TResult>型  どんなに引数が増えても右端が戻り値型

 Func<TResult>型   引数なしで、TResult型を返すメソッドを参照するデリゲート型

 

 

匿名関数

ローカル関数と匿名関数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→デリゲードと匿名関数は、組み合わせて使えるというだけで、別々の仕組み。

 

ラムダ式

ラムダ式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→匿名関数を書くときに、使える構文のこと。

→デリゲート型の変数に、メソッドの参照を代入する際に使える記述方法のこと。

  デリゲート型 変数 =    (引数リスト) =>  {関数本体}

    // 紫のところが匿名関数、それをラムダ式で書いている。

    // => ラムダ演算子(アロー演算子、goes to演算子)を使って、記述する。

 

 

インクリメント++演算子

→前置きインクリメント(++a)  は、aに+1してから、その式が実行される。

→後置きインクリメント(a++)  は、その式が実行されてから、aに+1される。

 

 

用語

・summary  :概要

Invoke :起動する  呼び出す

 

 

 

 

2月学習まとめ プログラミング編

プログラミング

・ゲームキャラを動かす基本

 ①Inputクラスのメソッドで得た値を、

  Vector3 direction;に入れる。

 ②ゲームキャラのtransformで、transform.TransformDirection(direction);し、  

  ゲームキャラのpositionから、Direction分動いた座標を得る。

 ③得た座標にTime.deltaTimeをかけて、CharacterController.Move関数にわたす。

 

静的クラスの使い方

Utils(Utilities)クラスというStaticなクラスを作って、そこにいろんなStaticメソッドを追加し、必要なときに「Staticクラス名.Staticメソッド名」で呼び出して使う。

→Staticクラスを作るときは、MonoBehaviourを継承しない。

→Staticクラスは、ゲームオブジェクトにアタッチしなくても、プロジェクトにあれば、

 「Staticクラス名.Staticメソッド名」で呼び出して使える。

 

★X個をY間隔でわけるときの位置を求める数式
  for(int i = 0; i < X; i++){
    answer = Y * ( i / ( X - 1 ) - 0.5f);
  } 

 

スクリプトを作るときメンバ変数を 「 m_メンバ変数 」と設定しておくと、

それをいざ使うときに、m_と打ったときに、

すべてのメンバ変数が予測候補に出てくるのですごく便利。

2月学習まとめ C#・用語編

 

C#スクリプト

名前空間→クラスなどの名前の競合を防ぐためのもの

 定義→namespace 名前空間名{}

 決まり→名前空間で定義できるものは、クラス、構造体、インターフェイスなど

     メソッドや変数は定義できない。

 例→

    namespace Cat{class Animal{}} 

            namespace Dog{class Animal{}}

         Cat.Animal cat = new Cat.Animal();

           Dog.Animal dog = new Dog.Animal();

           クラスのインスタンスを作るときに、クラスの前に

    名前空間名.クラス名とするとその名前空間のクラスが

    使えるということになる。

・usingディレクティブ→usingディレクティブを使うことによって

 上で書いたコードの「名前空間名.クラス名」の名前空間名を書くところを省略できる。

 決まり→Usingディレクティブはプログラムの冒頭に置く。

スクリプトを作ると、プログラムの冒頭に

 「using System」「using UnityEngine」「using System.Collections」

 とあるがこうすることで、

 System.クラス名 UnityEngine.クラス名と書くところの名前空間名を省略できるようになる。

・「using System.Collections」とあるが、これは名前空間Systemの中の

 名前空間Collectionsのこと。

 名前空間の中に名前空間を作ることもできる。これを名前空間のネストという。

・メソッドの再帰呼び出し→階乗計算、フィボナッチ数列で使える。猫C#p171

・静的クラス、静的メンバ (猫C#p192)→

 staticキーワードをつけて定義されたクラスやメンバは、

 「インスタンス化せずに」クラス名.メンバ名で呼び出せる。

 例 Input.GetAxis(”Horizontal"); Debug.Log();

 

・プロパティ→数値の出し入れを簡単にできるもの?

 定義→ データ型 プロパティ名{

        get{return  x;}

                        set{ x = value;}

                }

 キーワード get set value 

f:id:five_Y:20190205091237p:plain

プロパティ

同じmc.PropTestという文章でも、出したり入れたりできるのが便利?

 

・クラス名、メソッド名、プロパティ名の頭は、大文字。

 変数名は小文字。

 例 class Myclass{}

         public doble Mymethod() 

         public double dl ;

・クラス継承

 定義 class 派生クラス名 : 基本クラス名{}

 派生クラスは、基本クラスのPublicなメンバをすべて引き継ぐ。

・protectedアクセス修飾子をつけると、そのメンバは、そのクラスと派生クラスから

 しかアクセスできなくなる。

・constキーワード→変数にconstキーワードをつけると、定数になる。

          宣言と同時に初期化する必要がある。

          const で定数にした変数名は頭を大文字にする?

          例 const   float   Gravity = 9.81f;

・Listクラス

 →Unityのクラスではないので、Unityリファレンスで調べてもでてこない。

 →ListはC#のクラス

 →4つブックマークあり。

 →使うときは、System.Collections.Generic名前空間を宣言。

 →定義 List<格納する型> list = newList<格納する型>();

 →追加 Add関数。list .Add(格納するインスタンス);

 →アクセス 配列と同じように[index]を用いてアクセス。list[index];

 →格納数 Countプロパティを使う。配列のLengthプロパティと同様の使い方。

      int i = list.Count;

 →削除  void RemoveAt(int index);  index番の要素w取り除き、そのインデックスのあとの要素を詰めてくれる。

 

列挙型

→定義   enum 列挙名 : 型   {列挙子、、、}

→:型を特に定義しなければ、型Intになる。

→列挙名の頭文字は大文字。

→列挙子の頭文字は大文字。

→アクセスの仕方、   列挙名.列挙子

→列挙子には、0から順に数字が入っていく。

→列挙子=1,とすると、0からではなく、1から順に数字が入る。

→例 

    enum  MyMonth{ Jan=1、Feb,Mar,Apr,May,Jum,Jul,Aug,Sep,Oct,Nov,Dec};

 

      Debug.Log ( (int) MyMonth.Feb);          //2

      Debug.Log ( (int) MyMonth.Dec);           //12

 

 →列挙名の変数を定義して、それに列挙子を入れることもできる。

    

       MyMonth month = MyMonth.Jan;

      これを利用してSwith文などをわかりやすくすることができる?

      3D2Dのp330 GameControllerスクリプト

enum型(列挙型)の変数は(int)とキャストできる。

 int型にキャストしたenum型の変数は、(enum定義名)でまたキャストしなおせる。

enum型をクラスの外で定義すると、他のクラスからもその「enum名.列挙子」でアクセスできる。

 

Switch文

→Switch分は、式の値に応じた選択肢が複数あるときに使う。式が返す値は整数型か、String型でなければならない。

→定義 switch(式)

    {   

      case 定数式1:

         処理1;

         break;

      case 定数式2:

         処理2;

         break;

      default:

         処理3:

         break;

               }

→式が定数式1と一致するときは、処理1が実行され、breakキーワードでSwitch文を抜ける。

→式が定数式1、定数式2にも当てはまらないとき、defaultないの処理がされる。defaultはなくてもいい。

 

 foreach文

→定義  foreach(データ型 変数名 in  配列の変数名){ 処理;}

→引数にある配列の要素を、引数にある変数に代入し、{}内の処理を行う。

 それを配列の要素すべてに行う。

→例

   int   num = new int{10,20,30,40};

   foreach(int i  in  num){

     Debug.Log(i);

   }

      // 10  20  30  40

    

 

Staticメンバについて

→静的クラスの中のメンバは全てStaticメンバでなければならない。

インスタンスクラスのメンバは、Staticメンバ、インスタンスメンバ混ぜれる。

→「インスタンスクラス名.Staticメンバ」でアクセスできる。

→Staticメソッドのなかでは、インスタンス変数、インスタンスメソッドを使うことはできない。インスタンスメンバは、newでインスタンスが生成されたインスタンス固有のものだから。

 

★varキーワード 型推論

暗黙的に型指定されるローカル変数 - C# プログラミング ガイド | Microsoft Docs

型推論と匿名型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→暗黙の型指定。ローカル変数に使える。初期化するときにのみ使用可能。

→初期化のときの右辺から、自動で型を指定してくれる。

→ローカル変数 : メソッドの中で宣言した変数のこと。

  ⇔インスタンス変数 : フィールドで定義している変数のこと。

→ローカル変数に使えるので、Updateなどの関数内で使える。

 例 

   var  x = 5;   (xはInt型になる)

   var  index = Random.Range(0,360);       (indexはInt型)

   var ar = new [ ] {1,10,20,-4}          (arはInt型配列  Int[]型)

      //public GameObject   enemyPrefab;  //フィールド

   var  enemy  = Instantiate(enemyPrefab);       (enemyはInstantiate関数が返すGameObject型)

 

★foreach文でのvarキーワード

→foreach文定義

 foreach(データ型  変数名 in コレクション名){  処理  }

 コレクションから一つずつ要素を取り出して 変数名に代入し、処理を行う。

 それをコレクションの要素数回分行う。

→foreach文では取り出すアイテムの型は、コレクションの型に決まっているため、暗黙の型指定が行える。

 foreach(var 変数名  in コレクション名){ 処理 }

 例

   LIst<Int>  items =  new List<Int>{10,20,30}; 

                   // Listクラスは List<> x = new List<>{要素};で要素を入れて初期化できる。

      // 普通にListクラスを作るときは List<> x  = new  List<>(); 

   foreach(var item in items){ 

        Dubug.Log(item);

   }

                    // itemはInt型?

 

var x = new {}  匿名型

型推論と匿名型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→型を自動生成してくれる仕組み。getアクセサーを持ったプロパティを持っている。

 

ジェネリック

ジェネリック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

→猫C#   p351

→様々な型に対応したクラスやメソッドを作れるようにする仕組み。 

→メソッドのパラメータやクラス内で宣言する型を、引数のように使うことができる。

 <型引数>

→GetComonent<Rigidbody>();はGetComponent関数がジェネリックを使って定義されているからこう書ける。GetComponent関数はジェネリックメソッド。

 

★System.Linq名前空間

第6回 LINQ基礎編(2/3) - @IT

LINQ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

LINQ (Language Integrated Query)   :C#という言語に統合されたクエリ。

→Integrated : [形容詞]  統合した、完全な、

→Quary :(kwí(ə)ri)  [名詞] 質問、問い合わせ  (questionより形式ばった語) 

        データベースに対する命令文のこと。

→「using System.Linq;」が必要。

 

用語系

・Threshold→閾値(しきいち、いきち)のこと。スレッショルド

・width   ウィズ   :  幅

・height  ハイt     tはトゥの無声音    :高さ

・depth  デェプス  奥行き

・miscellaneous ミサレイニアス  : 雑多な、多方面の。

 →Animatorコンポーネントをつけるとき、Componentメニュー→miscellaneous→Animator

★Init :Initial の略   Initial :[形容詞] 最初の、はじめの、

 Init関数→初期化関数

 ・enumerable : (injúːmərəbl)  [形容詞]  数え上げられる

 

  

2月学習まとめ Unityスクリプト編

Unityスクリプト・知識

・ローカル座標→親の座標を原点としたときの子の座標。

    transform.positon →常にワールド座標

    transform.localPosition→ローカル座標(1つ上の階層のゲームオブジェクトの座標を原点としている)

 

・UIのコンポーネントスクリプトから扱うには、

 「using UnityEngine.UI」が必要。

 

★他のスクリプト内で、メンバにpublic Player playerとして、InspectorでPlayerを設定する ことの省略

 Playerスクリプトで、public static Player m_instance;とし

 Awake関数内で、m_instance=this; (thisはplayerクラスのインスタンス)とすることで、

 他のスクリプトで、Player.m_instanceでPlayerクラスのインスタンスにアクセスできる。

 

Unityスクリプト・気づき・理解

・Unityの前提知識

f:id:five_Y:20190208180948p:plain

Unity基礎

・Update関数は、毎フレーム呼ばれる。Updateの中でint i; i++;するとフレーム数が確認できる。

    Update関数の中に書いた処理は、1フレームの間にすべて実行される。

・フィールドをpublicにして、Inspectorで何も入れなかったら、

    intなどのデータ型 → 0などに初期化される。

    GameObjectや、Rigidbodyなど →nullが入る。

                使い方の例

                       public GameObject effectPrefab;

                       ・・・

                        if(effectPrefab !=null){ }

 

方向ベクトル

→点Aから点Bの方向ベクトルを得るには、点B座標(w,v)ー点A座標(x,y)をすればいい。

 座標の差を取って得た数値(m,n)は、「座標ではなく、方向ベクトルである」

 その数値は、点Aから点Bにむけての「方向、角度」のデータを保持している。

→プレイヤーから、マウスの位置の方向を得るには、

 マウスの座標ープレイヤーの座標  をしてやればいい。

 

・Mathf.Sin関数以外にも、便利な関数がある。

    関数というのは、Xを渡すとYを返してくれるもの。

    Mathf.Sin関数は、Xを返すと、そのXの大きさにより、-1~1の値を返してくれる。

    Mathf.Abs関数→渡した値の絶対値を返してくれる。(ーを取って正の値返してくれる)

 

・Awake関数→オブジェクトが生成された瞬間に呼ばれる。

 Start関数→オブジェクトが生成されて、はじめてのフレームの直前に呼ばれる。

 注意点→Unityにおいてゲームスタート時のゲームオブジェクトの生成順はランダムなため、Awake関数内で、そのスクリプトがアタッチされたゲームオブジェクト以外のゲームオブジェクトにアクセスしようとするとNull参照が起こる可能性があるので、Awake関数内では、そのスクリプトがアタッチされているゲームオブジェクト内で完結する処理のみをかくようにすること。

 

★Vector3型変数に、Vector2.downなどを入れると、自動的にZを0にして代入してくれる

 

 

Unityスクリプト・関数説明

 

Physics.gravity変数

 public static Vector3 gravity

Physics.gravity - Unity スクリプトリファレンス

→Physics.gravityの値は、Unity内のPhysicsManagerのGravityパラメーターと紐付いている。

→「GravityController.cx」(3D2D p98)

 

Vector3.normalized変数

 public Vector3 normalized;

Vector3.normalized - Unity スクリプトリファレンス

→Vector3.normalized変数は、そのVector3インスタンスのもつVectorの方向の情報は

  維持したまま、長さを1にしたベクトル情報をもつ。

  (1,1,0)や(1,0,0)や(0,0,1)のこと?

    Vector3 vector1 = new Vector3();

    vector1にInput.GetAxisでベクトル情報を入れる。

    最後に

    Physics.gravity = 9.81 * vector1.normalized;

    することで、InputGetAxisされた方向に重力をかけることができる。

 ・スクリプト内でpublicで定義された変数は、Unity内のパラメータとして表示され変更できる。

 

Application.isEditor変数

 public static bool isEditor;

Application.isEditor - Unity スクリプトリファレンス

→エディター上でプレイしているかどうかで処理を分けるときに使う。

 例

  if(Application.isEditor){エディター内での処理}else{スマホなどの処理}

 

Input.acceleration変数

 public static Vector3 acceleration;

Input.acceleration - Unity スクリプトリファレンス

スマホでの加速度センサーの傾きの情報がここに入ってる。

 例 

  Input.acceleration.x (.y.z) 変数 → スマホでの加速度センサーのX軸(y,z)の傾き

 

MonoBahaviour.OnTriggerStay

 void OnTriggerStay(Collider other){}

MonoBehaviour.OnTriggerStay(Collider) - Unity スクリプトリファレンス

→Update関数、Start関数のように、自分で定義して使う関数。

→オブジェクト同士のコリジョンが発生している間、毎フレーム呼ばれる。

→パラメータのCollider otherは、衝突してきたゲームオブジェクトのコライダーコンポーネントインスタンス

 

Object.Instantiate

 public static Object Instantiate(Object original);   //他にも定義あり。

Object.Instantiate - Unity スクリプトリファレンス

→Objectクラスの関数なので、前に何もつけずに使える。

→Instantiate関数は生成するオブジェクトと同じ型を返すので、

   プレハブなどのGameObject型を生成するときは、GameObject型を返す。

   Object型ではないので、

       (GameObject)Instantiate  キャスト

        Instantiate・・・asGameObject

  などの型変換は不要。

→Instantiateクラスは生成元を、ゲームオブジェクトではなくコンポーネントにしたとき、

   「まずGameObjectを生成し、それにアタッチされていたコンポーネントクラスを返す」

       例: Rigidbodyを生成元にしたとき、

            public Rigidbody prefab;

            Rigidbody r = Instantiate( prefab, ・・・); 

            (そのRigidbodyコンポーネントがついているゲームオブジェクトを生成し、

              Rigidbodyクラスの参照を返している。)

      これを使えば、

            public GameObject prefab;

            GameObject  g = Instantiate(prefab,・・・):

            Rigidbody r = g.GetComponent<Rigidbody>();

       のGetComponentを使うのを省略できる。

 

thisキーワード

→thisキーワードは、そのスクリプトのクラスのインスタンスを指す。

   (なので、this.Instantiateは、「this.Staticメソッド()となりエラーとなる」

   Staticメソッドは、クラス.Staticメソッドとしなければいけない。

 this→そのスクリプトのクラスのインスタンスのこと。

    this.gameObject→そのスクリプトがアタッチされているゲームオブジェクトのGameObjectインスタンスのこと。

    Destroy(this): →スクリプトコンポーネントが削除される。

    Destory(this.gameObject);→スクリプトのアタッチ先のゲームオブジェクトが削除される。

 

Debug.Log

 public static void Log(object message);

Debug.Log - Unity スクリプトリファレンス

→Debug.Log("文字列”); 

スクリプトの任意の場所に置くことで、Debug.Log関数が読み込まれたとき、

 パラメータの文字列が、コンソールに表示される。

 

Debug.Break

 public static void Break();

Debug.Break - Unity スクリプトリファレンス

→呼び出されたタイミングでUnityのプレビュー(ゲームの再生)を一時停止する。

 この2つの関数は、ゲームの動作チェックなどですごく便利。

 

Mathf.Sin

 public static float Sin(float f);

Mathf.Sin - Unity スクリプトリファレンス

→「反復移動」を実現するには、Mathf.Sin関数を使うと良い。

f:id:five_Y:20190208194804p:plain

Mathf.Sin関数イメージ図

→Mathf.Sin(float f) のパラメータfにTime.time(経過時間)を渡すと、角度fは、単位円を

   ぐるぐると回り続けるので、結果Mathf.Sin関数は-1から1の値を反復して返す。

   それに任意の値zをかけてやれば、-z~zの反復する値を取得できる。

   それをTransform.positionの値にセットすれば、ゲームオブジェクトは反復移動する。

 

Object.Destroy

 public static void Destroy(Object obj , float t = 0.0f);

Object.Destroy - Unity スクリプトリファレンス

→Objectクラスのメソッドなので、前に何もつけずに使える。

→引数にGameObjectを渡すと、そのゲームオブジェクトを削除できる。

→引数にObject型とあるが、たぶんObject型を継承しているGameObjectクラスや

 Rigidbodyクラス、Colliderクラスなどを指定してもいいと思う。

→引数にコンポーネントを渡すと、そのコンポーネントがアタッチされているゲームオブジェクトは削除されずに残って、そのコンポーネントだけ削除される。

→パラメータにあるfloat fはオブジェクトを削除するまでのディレイ時間で

 =0というのは、何も指定しなかったら、0がデフォルトで入りますよという意味。

 

コルーチン関数

   →コルーチン - Unity マニュアル   

   →フレームをまたいで何かをするのに便利。

   →yield return null;   この行で処理を一旦中断し、次のフレームでその行から処理を再開する。

   →yield return new WaitForSeconds(1.0f);   この行まできたら、1秒待ち、処理再開。

   →同じコルーチン関数をX回呼び出すと、X個のコルーチンが起動し、

       コルーチンの中で定義されていたローカル変数は、X個作られる

・コルーチンを使った、残弾回復。3D2D p168,16

 

Component.GetComponent

 public Component GetComponent(Type type);

GameObject.GetComponent

 public Component GetComponent(Type type);

Component.GetComponent - Unity スクリプトリファレンス

GameObject.GetComponent - Unity スクリプトリファレンス

→GetComponent関数は、2つの場所で定義されている。

    Componentクラスで定義されているGetComponent関数。

              →作成したスクリプトのクラス内で、そのスクリプトがアタッチされている

                  ゲームオブジェクトの各コンポーネントの参照を得るときに使う。

                  例:

                           Animator  animator = GetComponent<Animator>();

                           animator.SetTrigger();

    GameObjectクラスで定義されているGetComponent関数。

              →コリジョン検知などで得た、ぶつかってきたゲームオブジェクトの

                  GameObjectクラスのインスタンスから、それにアタッチされている

                  コンポーネントの参照を得るときに使う。

                   例:

                             void OnTriggerStay(Collider other){

                                     Rigidbody  r  =  other.gameObject.GetComponent<Rigidbody>();

                              }

 

Transform.TransformDirection

 public Vector3 TransformDirection(Vector3 direction);

Transform.TransformDirection - Unity スクリプトリファレンス

インスタンスメソッド

→direction分動いた先のワールド座標を返す。

 例

  public Transform transform;

  transform.TransformDirection(direction);

       →transformコンポーネントがアタッチされているゲームオブジェクトから、

   direction分動いた地点の座標を返す。

 

Mathf.Clamp

 public static float Clamp(float value, float min, float max);

Mathf.Clamp - Unity スクリプトリファレンス

 

MonoBehaviour.OnControllerColliderHit

 void OnControllerColliderHit(Controller ColliderHit hit){}

MonoBehaviour.OnControllerColliderHit(ControllerColliderHit) - Unity スクリプトリファレンス

→CharacterControllerコンポーネントをアタッチしたゲームオブジェクトにコライダーがヒットしたときに呼び出される。

→void Updateのように void OnController ColliderHIt(ControllerColliderHIt hit)を定義して

中に処理をかく。

→3D2D p234,235

 

Transform.SetParent

 public void SetParent(Transform parent, bool worldPositionStay);

Transform.SetParent - Unity スクリプトリファレンス

インスタンスメソッド

→そのゲームオブジェクトの親を、parentに設定する。

→ worldPositionStay= trueのとき、

  そのゲームオブジェクトの座標を、そのままワールド座標として、親子関係を作る。

   例   ゲームオブジェクトが(0,0)のとき、ゲームオブジェクトは原点にいる。

  worldPositionStay= falseのとき、

 そのゲームオブジェクトの座標を、親に対するローカル座標として親子関係を作る。

   例 ゲームオブジェクトが(0,0)のとき、ゲームオブジェクトは、親と同じ場所になる。(0,0)が親に対するローカル座標として親子関係になる。

 

MonoBehaviour.OnDrawGizmos

 void OnDrawGizmos(){}

MonoBehaviour.OnDrawGizmos() - Unity スクリプトリファレンス

→Updateと同じようにvoid OnDrawGizmos()と定義する。

→3D2D p239

→ギズモとは、Sceneビュー上で、開発を効率よくサポートしてくれる表示のこと。

→Posionツールや、Rotationツール、カメラなど表示のこと。

→Unityがデフォルトで用意しているギズモもあるが、独自に設定することもできる。

 

Gizmos.DrawSphere

 public static void DrawSphere(Vector3 center, float radius);

Gizmos.DrawSphere - Unity スクリプトリファレンス

→OnDrawGizmos関数の中で使える関数。

→そのスクリプトのアタッチされているゲームオブジェクトの場所に円を描画する。

 

Gizmos.DrawIcon

 public static void DrawIcon(Vector3 center ,string name, bool allowScaling = true);

Gizmos.DrawIcon - Unity スクリプトリファレンス

→OnDrawGizmos関数の中で使える関数。

→string name で指定されたアイコンの画像を表示する。

 そのアイコンの画像が入っているフォルダは、Aseetsフォルダ直下のGizmosフォルダに入れておかねばならない。

 

GameObject.SetActive

 public void SetActive(bool value);

GameObject.SetActive - Unity スクリプトリファレンス

インスタンスメソッド。

→ゲームオブジェクトのアクティブのON/OFF。

 

SceneManager.LoadScene

 public static void LoadScene(string sceneName,....)   //他に定義あり。

SceneManagement.SceneManager.LoadScene - Unity スクリプトリファレンス

→引数に渡されたSceneに切り替える。

→Application.LoadLevelも同じ機能だったが、廃れて(Obsolete)使われなくなったらしい。

→ Application.LoadLevel(string name);  static   →引数と同じ名前のSceneに切り替える。

→使うときは、「using UnityEngine.Management;」する。

 

MonoBehaviour.Invoke

 public void Invoke(string methodName,float time);

MonoBehaviour.Invoke - Unity スクリプトリファレンス

→設定した時間に指定したメソッドを呼び出す。

→MonoBehaviourクラスで定義されているクラスなので、「継承元のクラスの関数は、頭になにもつけずに使える」。Instantiateと同じ使い方。

 

Behaviour.enabled変数

 public bool enabled;

Behaviour.enabled - Unity スクリプトリファレンス

→Unityで作ったスクリプトのクラスは、Behaviourクラスを継承しているので、この変数は頭になにもつかずに使える。

→enabled = false;とすると、そのスクリプトコンポーネントの更新を停止できる。

→Inspectorでいうコンポーネントの横のON,OFFボックスが、enabled変数と対応している。

スクリプトコンポーネントだけではなく、他のコンポーネントでもenabled変数があって、そのコンポーネントインスタンスを得てから、同じくfalseを入れるとそのコンポーネントをオフにできる。

 

PlayerPrefs.GetInt

 public static int GetInt(string key);

PlayerPrefs.SetInt

 public static void SetInt(string key , int value);

PlayerPrefs.GetInt - Unity スクリプトリファレンス

PlayerPrefs.SetInt - Unity スクリプトリファレンス

→ゲームのスコアをつけるときに使う。

→ GetInt関数でキーにある値を取り出す。 引数の名前のキーが作られていなかったら、作って初期値を返す。

→SetInt関数でキーに、引数の値をセットする。

 

Transform.Translate

 public void Translate(Vector3 translation);

 public void Translate(float x, float y, float z );

Transform.Translate - Unity スクリプトリファレンス

→引数の値分、移動させる。引数のワールド座標に移動させるのではない。

 

Mathf.Atan2

 public static float Atan2(float y , float x);

Mathf.Atan2 - Unity スクリプトリファレンス

→引数に設定したYとXを、原点からのYベクトル、Xベクトルとみなしたとき、

 TanθがY/Xとなるとき、その間の角度をラジアンで返す。

 

Mathf.Rad2Deg変数

 public static float Rad2Deg;

Mathf.Rad2Deg - Unity スクリプトリファレンス

→定数

ラジアンから度に変換するための定数。

ラジアンにこの定数を掛けると、度になる。

→360/(PI*2)。

→詳しくはp316プリント

 

Quaternion.Euler

 public static Quaternion Euler(float x , float y, float z);

Quaternion.Euler - Unity スクリプトリファレンス

→transform.ratation = Quaternion.Euler(0,0,z);

 とすると、ゲームオブジェクトがZ軸でz分回転する。

 

MonoBehaviour.OnCollisionEnter2D

 void OnCollisionEnter2D(Collision2d other)

MonoBehaviour.OnCollisionEnter2D(Collision2D) - Unity スクリプトリファレンス

→コライダー同士が衝突したときに呼び出される関数。

→トリガーにコライダーが衝突したときは、OnTriggerEnter関数。

 

Component.SendMessage

 public void SendMessage(string methodName);

Component.SendMessage - Unity スクリプトリファレンス

→同じゲームオブジェクトについている他のコンポーネントのメソッドを呼び出せる。

→Aスクリプト内で、SendMessage(”Bスクリプトのメソッド”);として呼び出すことができる。AスクリプトとBスクリプトは同じゲームオブジェクトにアタッチされている必要がある。

→GameObjectの参照から、SendMessage("メソッドA”)とすることで、そのゲームオブジェクトについているスクリプトで定義されているメソッドAを呼び出せる。

  例 

    GameObject  gameController;

    gameController = GameObject.FindWithTag("GameController");

    gameController.SendMessage("IncreaseScore");

 

GameObject.SetActive

 public void SetActive(bool value);

GameObject.SetActive - Unity スクリプトリファレンス

 

Object.FindObjectsOfType

 public static Object[] FindObjectsOfType<コンポーネント名>();

Object.FindObjectsOfType - Unity スクリプトリファレンス

→<コンポーネント名>で指定されたコンポーネントを、シーン中のすべてのゲームオブジェクトから検索し、あるだけ取得し、そのコンポーネントクラス型の配列に入れる。

→例

   ScrollObject[ ]   scrollObjects = GameObject.FindObjectsOfType<ScrollObject>();

    →シーン中のすべてのScrollObjectコンポーネントを探し、その参照をScrollObject型の配列に入れる。

→GameObjectクラスはObjectクラスを継承しているので、

 GameObject.FindObjectsOfType・・・として使える。

 

Rigidbody.isKinematic変数

 public  bool  isKinematic;

Rigidbody.isKinematic - Unity スクリプトリファレンス

Rigidbody2D.isKinematic - Unity スクリプトリファレンス

→物理演算の影響を受けるかどうか。

→ isKinematic =  true;     のとき、物理演算の影響を受けない

→ isKinematic =  false;    のとき、物理演算の影響を受ける。間違えやすいので注意。 

→他のコンポーネントでいう enabled  のようなもの。

→Rigidbodyコンポーネントには、enabled変数はなく、代わりにisKinematic変数がある。

→ただし上で言ったように、enabledとはfalse trueの意味があべこべなので注意。

 

MonoBehaviour.OnTriggerExit( Collider other)

 MonoBehaviour.OnTriggerExit2D( Colllider2D  other)

MonoBehaviour.OnTriggerExit(Collider) - Unity スクリプトリファレンス

→コライダーがトリガーにふれるのを「やめたとき」、OnTriggerExitは呼び出される。

→OnTriggerEnterは、コライダーがトリガーに「ふれたとき」呼び出される。

 

GameObject.FindWithTag

 public static GameObject FindWithTag(string tag);

GameObject.FindWithTag - Unity スクリプトリファレンス

→引数のTagと同じ名前のTagを設定してあるゲームオブジェクトのGameObject参照を返す。

→Find系関数は、Update内で使わない。また極力つかうことをさけたほうがいい?

  3D2D p333  Find関数コラム

 

Text.text変数

 public string text;

UI.Text.text - Unity スクリプトリファレンス

スクリプト内で、Textインスタンス.text = "Score:" + 0;

 とすることでテキストの表示を変えられる。

→「using UnityEngine.UI;」が必要。

→Unityのキャンバスの仕組みの中のゲームオブジェクトなので、OnGUI関数の中には書かない。

→キャンバスシステムを使わずに、GUI系関数を使ってUIを描写するときは、OnGUI関数の中に書かなければいけない。

 

Camera.main変数

 public static Camera main;

Camera.main - Unity スクリプトリファレンス

→メインカメラのCameraクラスのインスタンスを得る。読み取り専用。

 

Input.mousePosition

 public static Vector3 mousePosition;

Input.mousePosition - Unity スクリプトリファレンス

→Input.mousePositionは「スクリーン座標」を返す。

 ワールド座標→UnityのScene内での座標

 スクリーン座標→解像度と一致する。640*480の場合、左が0で右が640。

         Mainカメラが写す四角形の座標と思えばいい。

     

Camera.WorldToScreenPoint

 public Vector3 WorldToScreenPoint(Vector3 Position);

Camera.WorldToScreenPoint - Unity スクリプトリファレンス

→Cameraクラスインスタンスから使う。

→Camera.main.WordlToScreenPoint(...)    

 

Transform.localEulerAngles

 public Vector3 LocalEulerAngles;

Transform.localEulerAngles - Unity スクリプトリファレンス

→Vector3  angels = transform.localEulerAngles;

 angles.z = 90f;

 transform.localEulerAngles = angels;

 で角度を変えられる。

→親に何も設定していなくても、このメソッドは使える。らしい。

→Transform.localRotationはQuaternion型で返すので、Vector3型で返すTransform.localEulerAngelsのほうが使いやすい。

 

Mathf.Lerp

 public static float Lerp(float a, float b, float t);

→aとbの間で、割合tのところの値を返す。

 

Mathf.InverseLerp

 public static float InverseLerp(float a, float b, float value);

→aとbの間で、valueのところの割合を返す。0~1の間のfloat値。

 

Mathf.Sin  

 public static float Sin(float f);
→単位円において、fラジアンのときのSinf=y座標の値を返す。-1から1の戻り値


Mathf.Cos  

 public static float Cos(float f);
→単位円において、fラジアンのときのCosf=X座標の値を返す。-1~1の戻り値。

 

Mathf.Deg2Rad変数

 public static float Deg2Rad;
→角度をラジアンに変換する。角度×Mathf.Deg2Rad でラジアンに変換。  

 

Vector2.down変数

 public static Vector2 down;

Vector2(0,-1)と同じ。ほかにup left rightなどある。

 

Object.name変数

 public string name;

そのコンポーネントがアタッチされているゲームオブジェクトの名前を返す。

Objectクラスで定義されている変数なので、ほぼすべての

コンポーネントからアクセスできる。gameObject変数と同じレベル。

 

★String.Contains 

public bool Contains(string value);

String.Contains Method (System) | Microsoft Docs

→その文字列が、valueを含むかどうか。含むならtrue,  含まないならfalseで返す。

valueは大文字小文字区別するので注意。

 

 

 

 

ParticleSystem.main変数

 public ParticleSystem.MainModule main;

→そのParticleSystemコンポーネントの、メイン設定にアクセスするために使う。

→メイン設定は、ParticleSystemコンポーネントを開いたときに最初から表示されている設定。Duration,Looping,StartDelay,,,などの設定。

 

ParticleSystem.MainModule.duration変数

 public float duration;

→ParticleSystemコンポーネントのDurationパラメータに設定されてある値を返す。

 

ParticleSystem.isPlaying変数

 public bool isPlaying;

→パーティクルが再生中ならばTrue  、再生がされていなかったら(再生が終了していたら)falseを返す。

Random. value変数

 public static float value;

→0.0~1.0の範囲のランダムな数を返す。 0.0、1.0を含む。

→Mathf.Lerp public static float Lerp(float a, float b, float t);

 の第3引数は、0~1の範囲を渡さければならない