ぱふの自由帳

週3更新(火・木・日)を目指すUnityブログ。良ければフォローお願いします(`・ω・´)

string型をint型に変換する【Unity】

私「文字列を整数に直すぞー。キャスト変換とか慣れたもんよ。」

int num = (int) "123";

私「よゆーよゆー。」

Unity「Cannot convert type 'string' to 'int'」

私「...。」

というわけで文字列を整数に直す方法を紹介します。

変換方法

以下の方法で変換できます。他にもあるとは思いますが...。

// 方法その1
int num = int.Parse("123");

// 方法その2
int num = Convert.ToInt32("123");

おわり

数値から数値ぐらいの簡単な変換なら()で変換できるんですかねー。 ちなみに、変換するときのオプションが指定できるのでググってみてください(`・ω・´)

【Unity公式チュートリアル】スクリプティング〈レッスン2.1-2.18〉

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 私&誰かの役に立ちそうなプチ知識をまとめています
  • 今回からレッスンタイトルにざっくりとした概要をつけました!←new!

レッスンタイトル&概要一覧

2.1 Properties
プロパティはカプセル化に役立つというお話。

2.2 Ternary Operator
三項演算子のお話。

2.3 Statics
Staticsとは?というお話。

2.4 Method Overloading
オーバーロードって?どういう優先順位で実行なの?というお話。

2.5 Generics
下のコードを見て「あ。ジェネリックじゃん。」って方は飛ばしておk。

public T GenericMethod<T>(T param)
    {
        return param;
    }

2.6 Inheritance
継承って聞いたことあるけどよく知らない...という方はみると良いかも。

2.7 Polymorphism
ポリモーフィズムについてというタイトルだがアップキャストとダウンキャストの話が主になっている。継承がよく分からない方には難しい?

2.8 Member Hiding
継承のときに使うnewのお話。

2.9 Overriding
オーバーライドのお話。

2.10 Interfaces
インターフェースについて簡単に解説している。

2.11 Extension Methods
拡張メソッドの意味 / 実装 / 呼び出し方法を解説している。

2.12 Namespaces
名前空間の作り方と使い方の説明。

2.13 Lists and Dictionaries
リストと辞書の基本的な使い方について。リストをMyルールでソートするための方法についての解説も少しだけある。

2.14 Coroutines
コルーチンの使い方の説明。「プロパティと組み合わせると効果があるよ。」という話も入っている。

2.15 Quaternions
クォータニオンの理論的な説明をするのではなく、Quaternionクラスに用意されている関数の使い方が主な内容。使ったことがない方は一度見ておくと何かと役に立ちそう。

2.16 Delegates
デリゲートについての話。以下のコードが「?」な方は是非見るべし。ただ、0知識からだと少し辛いかも?

delegate void MultiDelegate();
MultiDelegate myMultiDelegate;
    
void Start () {
    myMultiDelegate += PowerUp;
    myMultiDelegate += TurnRed;
    
    myMultiDelegate();
    }
    
    void PowerUp() {
        print ("Orb is powering up!");
    }
    
    void TurnRed() {
        renderer.material.color = Color.red;
    }

2.17 Attributes
属性の話。「属性?コードのあの部分でしょ?」って方は見なくてOK。「属性?なにそれおいしいの?」って方は一度眼を通すと良い。

2.18 Events
イベントの発生や購読 / 解除の仕方を説明。便利なので知らない方は見ておく価値あり。デリゲートの知識がないとわからないので注意。

オーバーロード時、どれが実行される?

  • 引数が完全一致するメソッドが存在する
    →そのメソッドが実行される

  • 引数が完全一致ではないが実行可能なメソッドが存在する
    →変換の少ないメソッドが優先的に実行される

  • 実行可能なメソッドが存在しない
    →エラー

new と overrideってどう違うの?

「たまには真面目に解説作るぞ!」と思って絵を書いているのですが間に合いそうに無いので私がすっきりした記事を紹介しておきます。

gacken.com

解説記事が出来上がったら差し替えます...(`・ω・´)

ひとこと

チュートリアルが各項目のさわりをさらっと解説しているので豆知識部分が少なくてすいません...。「デリゲートの解説!」みたいな項目作っちゃうとチュートリアル外の部分も解説しなきゃなので見送っています。面倒って理由もあr...

この先も豆知識的なの書けないままチュートリアルが進みそう...(´・ω・`。)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

publicな変数をInspectorに表示しない方法

はじめに

前回の記事《privateな変数やクラスをInspector上に表示する方法》の逆のようなことをやっていきます。

方法

その1: [HideInInspector]

[HideInInspector]
public int hoge = 10;

上のような使い方をするとInspector上から消えます。

しかし、注意が1つ!
これは見えなくなっているだけで、プレハブがこそっと値を保持し続けます。なので上のコードを書いていたとしても[HideInInspector]を使用する前にInspector上で書き換えていると"hoge=10"が保証されなくなります。

その2:[System.NonSerialized]

[System.NonSerialized]
public int hoge = 10;

上のような使い方をすると同様にInspector上から消えます。

しかし、先ほどとは違い”変数がこの値に初期化されます。”

どっちが良いの?

その1とその2を紹介しましたが特に強い目的がない限りは”その2”を強くオススメします!

おわり

その1は私は使用したことありません!使いどきがわかりませぬ(´・ω・`。)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

privateな変数やクラスをInspector上に表示する方法

はじめに

「privateで扱いたい、でもpublicのようにInspector上に可視化したい...。気をつけながらpublic使うしかないのか...。」という方向けの記事です。

表示方法

変数

[SerializeField]を変数の前につけるだけです。

クラス

[System.Serializable]をクラス定義の前につけるだけです。

関連記事

おわり

見えるようになると結構便利です!デバッグや変数に参照したいオブジェクトやコンポーネントを入れる操作が楽になりますヨd( ̄  ̄)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】スクリプティング〈レッスン1.13-1.28〉

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています

レッスンタイトル一覧

1.13 Translate and Rotate
1.14 Look At
1.15 Linear Interpolation
1.16 Destroy
1.17 GetButton and GetKey
1.18 GetAxis
1.19 OnMouseDown
1.20 GetComponent
1.21 Delta Time
1.22 Data Types
1.23 Classes
1.24 Instantiate
1.25 Arrays
1.26 Invoke
1.27 Enumerations
1.28 Switch Statements

n秒後にDestory

GameObjectを生成してから5秒後にDestroyしたいという時は以下のように書くことが出来ます。

void Start () {
    GameObject.Destroy (gameObject, 5f);
}

私はInvokeやコルーチンでDestroyを遅らせていました...。全く知らなかったです(´・ω・`。)

GetKey と GetButton

この二つは同じような使い方をすれば同じように動きます。ですが、Unityの公式はGetButtonを推奨しています。理由をググった結果、以下の記事で納得できたので紹介しておきます。

qiita.com

OnMouseDown

ユーザーがGUIElementまたはColliderを持つオブジェクト上でマウスボタンを押したとき、そのオブジェクトにOnMouseDown関数が設定されていれば呼び出されます。 しかし、Layerの設定がIgnore Raycastであれば呼び出されません。

以下はCubeにスクリプトをアタッチしています。

f:id:PafuOfDuck:20171030071437g:plain

値型と参照型

値型

値型の例として

  • int / float / double:数値を格納

  • bool:真偽値を格納

  • Structs:Vector3やQuaternionのような2つ以上の変数を持つ構造体

といったものがあります。

実際に変数の中に値が入っているのが特徴です。以下のようなスクリプトを実行してもスクリプトがアタッチされているオブジェクトは特に変わりません。これは変数posが値型であり、新たな値を代入するとpos自身の値が変更されているだけだからです。

void Start () {
    Vector3 pos = transform.position;
    pos = new Vector3 (0, 2, 0);
}

参照型

参照型は

変数が値の格納されているアドレスを持っているのが特徴です。以下のようなスクリプトを実行するとスクリプトがアタッチされているオブジェクトは(0,2,0)に移動します。これは変数tranが参照型であり、参照先の値を変更したために同じ場所を参照していたオブジェクトが動いたということです。

void Start () {
    Transform tran = transform;
    tran.position = new Vector3 (0, 2, 0);
}

Invoke系まとめ

Invoke(string methodName, float time)

Invoke("関数名", 実行までの待機時間)という感じで使用します。

void Start () {
    Invoke ("Hogehoge", 2f);
}

void Hogehoge(){
    Debug.Log ("ほげー");
}

これで開始から2秒後に「ほげー」という文章が出力されます。

注意点としては下の二つぐらいですかね。

  • void関数のみしか呼べない
  • 引数を渡せない

InvokeRepeating(string methodName, float time, float repeatRate)

InvokeRepeating("関数名", 実行までの待機時間, 再実行までの待機時間)という感じで使用します。

void Start () {
    InvokeRepeating ("Hogehoge", 2f, 1f);
}

void Hogehoge(){
    Debug.Log ("ほげー");
}

これで開始から2秒後に「ほげー」という文章が出力された後、1秒ごとに「ほげー」という文章が出力されます。

CancelInvoke(string methodName)

CancelInvoke("キャンセルする関数名")という感じで使用します。Invoke()やInvokeRepeating()で実行予定であった関数を指定してキャンセル出来ます。なお、キャンセルする関数名を書かないと全ての実行予定の関数をキャンセルしてしまいます。

ひとこと

OnMouseDownは上手く使えば、タッチされた場所取得してRay飛ばして...とかせずに済みそうですね(^^)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】スクリプティング〈レッスン1.8-1.12〉

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています

レッスンタイトル一覧

1.8 Awake and Start
1.9 Update and FixedUpdate
1.10 Vector Maths
1.11 Enabling and Disabling Components
1.12 Activating GameObjects

Awake()に注意

Awake()スクリプトが非アクティブでも実行される。
参考リンク:Scriptを非アクティブにしても生き残る関数たち

Start()の実行タイミング

Start()スクリプトがアクティブな状態での最初のフレーム(Update()の前)で一度のみ実行される。アクティブなスクリプトを一旦、非アクティブにした後に再びアクティブにしても実行されないことに注意。

ベクトルのプチまとめ

長さ

長さは”Magnitude”と呼ばれる。自前で計算しなくて済むように変数(Vector2.magnitudeVector3.magnitude)が用意されている。

内積

二つのベクトルの各要素を掛け合わせたものの和。和が0になるかどうかでベクトルが垂直であるかどうかの判断に使うことが出来る。

使用例:飛行機が地面に対して水平かどうかを調べる

なお、内積を計算する関数(Vector2.DotVector3.Dot)が用意されている。

外積

二つのベクトルに垂直なベクトルを生成する。二つのベクトルからなる平面に垂直なベクトルが誕生するイメージ。当たり前だが、2Dでは概念自体が存在しない。

使用例:戦車の放題の回転前後のベクトルから回転軸ベクトルを求める

なお、外積を計算する関数(Vector3.Cross)が用意されている。

enable と SetActive()

公式チュートリアルコンポーネントのアクティブ切り替えにはenableを、GameObjectのアクティブ切り替えにはSetActive()を使用していたので従うのが吉?

activeSelf と activeInHierarchy

activeSelf:自身がアクティブかどうか
activeInHierarchy:実際にアクティブかどうか

分かりづらいと思うので具体例を以下に示します。

f:id:PafuOfDuck:20171030024913p:plain
上画像のような構造になっているオブジェクトがあるとする。この時のBについて見ていく。

  • Aがアクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → true

  • Aがアクティブ / Bが非アクティブ
    activeSelf → false
    activeInHierarchy → false

  • Aが非アクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → false

  • Aが非アクティブ / Bが非アクティブ
    activeSelf → false
    activeInHierarchy → false

親が非アクティブな時点で子も非アクティブ扱いになるのでactiveInHierarchyは親が非アクティブであれば100%falseになりそうですね(`・ω・´)

ひとこと

activeSelf と activeInHierarchy...。私は何に使えるか思いつきませんが役に立つ時が来るんでしょうね...(´・ω・`。)タブン

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】スクリプティング〈レッスン1.1-1.7〉

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています

レッスンタイトル一覧

1.1 Scripts as Behaviour Components
1.2 Variables and Functions
1.3 Conventions and Syntax
1.4 C# vs JS syntax
1.5 IF Statements
1.6 Loops
1.7 Scope and Access Modifiers

スクリプトの作成とアタッチ方法

作成方法

1. Projectウィンドウ→Create
f:id:PafuOfDuck:20171028214256p:plain

Createボタンではなく、右クリック→Createからでも作成できるf:id:PafuOfDuck:20171028214628p:plain

2. Inspectorウィンドウ→AddComponent→New Script
f:id:PafuOfDuck:20171028214829p:plain

これは作成と同時にそのオブジェクトにアタッチ(追加)されてしまうので注意して下さい。

アタッチ方法

1. ドラッグ&ドロップ(D&D)
アタッチしたいゲームオブジェクトにスクリプトをD&Dするだけ。

2. Inspectorウィンドウ→AddComponent→Script
f:id:PafuOfDuck:20171028215250p:plain

3. Inspectorウィンドウ→AddComponent→New Script
作成の2. で紹介した方法。作成と同時にアタッチしてくれる。

4. 上のメニューバー→Component→Scripts
f:id:PafuOfDuck:20171028215829p:plain

何かGameObjectを選択していないと使用できないので注意!

デフォルトのアクセス修飾子

C#では下のような場合、privateとして扱われる。

int num = 1;

なお、JavaScriptはpublic扱いらしいので注意。

public修飾子の罠?

public修飾子をつけたメンバ変数をスクリプト内で初期化していてもInspector側の数値に書き換えられることに注意。Start関数で初期化したり、[System.NonSerialized](参考リンク:工事中)を付加したりする工夫が必要。

ひとこと

前の書き方は長ったらしいなーと感じていたので変えてみました。
だいぶ見やすくなったんじゃない?って感じです(`・ω・´)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ヒエラルキーウインドウとオブジェクトの親子関係 編

ヒエラルキーウインドウとは

シーン内に存在するオブジェクトを追加された順に表示、かつ親子関係も階層的に表示する。また、以下の機能を持つ。

  • 表示順番は任意に変更することが可能
  • ヒエラルキーウインドウからオブジェクトの削除や複製も行うことが可能

ツールバー

  • Create ボタン
    f:id:PafuOfDuck:20171025180303p:plain
    新しい空のゲームオブジェクトを作成したり、デフォルトで用意されているゲームオブジェクトを作成する際に使用する。

  • Search バー
    f:id:PafuOfDuck:20171025180324p:plain
    シーン内のオブジェクトを探す際に使用する。

親子関係

親子とは

二つのオブジェクトが階層になっている場合、階層の上のオブジェクトを”親”と呼び、階層が下のオブジェクトを”子”と呼ぶ。この時、二つのオブジェクトの関係を親子関係という。

f:id:PafuOfDuck:20171025175043p:plain

親子による影響

f:id:PafuOfDuck:20171025175550p:plain

f:id:PafuOfDuck:20171025175553p:plain

上の画像のような親子が存在していたとする。この時、子のワールド座標は親のワールド座標に自身の座標を足したものとなっている。(Transformはローカル座標を表示している。)
このように、Transformが親の影響を受ける。ゆえに、シーンビューで親を動かすと子も同じように動く。もちろん、子を動かしても親は動かない。

ひとこと

タイトル長すぎ問題...。どこか削って短くしようかなぁ。

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

ゲーム再生中のエディタの色を変更する方法【Unity2017.1】

はじめに

今回は下の画像のようにエディタの色を変える方法です。
再生中ってことを視覚的に理解する助けになりますよ〜。

f:id:PafuOfDuck:20171025215731p:plain

やり方

  1. メニューバーからUnity → Preferencesを選択(Macであれば "commnd" + "," でも可)します。

  2. ウィンドウが開いたら下画像の赤枠の箇所を変更します
    f:id:PafuOfDuck:20171025220519p:plain

3.以上!

おわり

記事を書き終わって思ったのですが、何も設定せずとも再生中の色って変わるんでしたっけ...。
まぁタイトル詐欺にはなってないしセーフかなぁ(´・ω・`。)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ゲームビュー 編

ゲームビューとは

ゲーム内のカメラから見たものをレンダリングする。最低でも1つ以上のカメラが必要となる。再生 / 一時停止 / 1フレーム送り は以下のボタンで行う。

f:id:PafuOfDuck:20171025171516p:plain

なお、再生中に変更した内容は再生を終えると再生前の内容に戻る。

ゲームビューコントロールバー

  • Display ボタン
    f:id:PafuOfDuck:20171025163953p:plain
    シーンにカメラが複数ある時に切り替えることができる。

  • Aspect ボタン
    f:id:PafuOfDuck:20171025163602p:plain
    アスペクト比率が異なるモニターでどのような表示になるかをテストする。

  • Scale スライダー
    f:id:PafuOfDuck:20171025164352p:plain ゲームシーンをズームできる。

  • Maximize on Play ボタン
    f:id:PafuOfDuck:20171025164414p:plain
    有効にするとゲームシーンをスクリーンと同じ最大のサイズで再生する。

  • Mute Audio ボタン
    f:id:PafuOfDuck:20171025164427p:plain
    有効にすると再生中にゲーム内のオーディオをミュートにする。

  • Stats ボタン f:id:PafuOfDuck:20171025164509p:plain
    レンダリング統計を表示する。ゲームのパフォーマンス確認に役立つ。

  • Gizmo ボタン f:id:PafuOfDuck:20171025164521p:plain
    Gizumoの表示 / 非表示を切り替える。特定のGizmoだけを表示したい時はドロップダウンだけをチェックする。

高度なオプション

f:id:PafuOfDuck:20171025165903p:plain

  • Warn if No Cameras Rendering
    有効にすると画面にレンダリングするカメラが無ければ警告が表示される。

  • Clear Every Frame in Edit Mode
    有効にすることでゲームが再生中でないときはフレームごとにゲームビューが消去される。(すいません。機能がよくわかっていません...。)

関連(参考)ドキュメント

豆知識

ひとこと

Clear Every Frame in Edit Modeってなんなのでしょう。色々試したのですが良く分かりませんでした...。