はきだめ

プログラミングのこととか色々

Unity本1冊目まとめ

今回は自分が初めて買ったUnity本を以前読んだところまでもう一度読み直し、自分用に大事だと思ったところをまとめました。ちなみにこの本です。

chapter1 プログラミングの準備をしよう!

unityの使い方
monodevelopmentの使い方

主に環境構築などの話です。サークルのゲームジャムに参加したときは圧倒的にvisual studioを使ってる人が多かったですね…。
ちなみにscriptを開いたときにデフォルトで開かれるエディタは変更することが出来ます。
Unity→Preferenceを選択して

f:id:kurome-stdio:20170506202849p:plain

External Toolsを選択して、右上のやつを変更すればデフォルトのエディタを変更することが出来ます。

chapter2 C#を使おう!

C#には沢山の値の型があるみたいです。

  • 整数
    – short…符号付き16ビット整数
    – int…符号付き32ビット整数
    – long…符号付き64ビット整数

  • 実数
    – float…32ビット幅の値
    – double…64ビット幅の値

他にもいろいろあったけどこの辺ぐらいしか使わないだろう思うので省略。

Unity内ではでは普通に値を書くと

123…int型
123.0…double型
123.0f…float型

と判定されるみたいです。floatにするときはfをつけよう。他にも定番のchar型とかstring型があります。

ちなみにプログラムのソースコードにおいて使用される、数値や文字列を直接に記述した定数のことをリテラルって言うらしい。

画面内にテキストを表示させるプログラム

GameObject→UI→Textを選択し、textオブジェクトを生成。

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

public class HelloWorld : MonoBehaviour {
    public Text text;
    void Start () {
        text.text = "Hello World";
    }
    }
}

f:id:kurome-stdio:20170506215922p:plain

そして先程作ったtextオブジェクトこのスクリプトを貼り付けてtextって書かれた変数にインスペクタ上からさっき作ったtextオブジェクトを貼ると画面にHello Worldが表示されるって流れです。

public Text textについて

textという名のTextオブジェクトを宣言し、先程この変数に画面に表示されているtextオブジェクトをアタッチしたので、このtextという変数が、シーンに配置したTextコンポーネントの部品そのもののように扱える様になっているという感じだと思います。ちゃんとオブジェクト指向を理解してないから上手く説明できない…。
text.textの意味としては前にあるテキストがTextコンポーネントが入っている変数。後にあるtextがTextに保管されているインスタンスのプロパティでTextに表示されているテキストを表しているものです。

Textコンポーネント…Unityのテキストに関する機能が集まった部品

オブジェクト…独立して扱うことの出来るプログラムのかたまり。メソッドと値(フィールド)を持ったもの。ゲームはシーン、モデル、証明、カメラといったオブジェクトの集まりで出来ている。

クラス…オブジェクトの設計図。

継承について
例)class クラス名 : 継承するクラス名 {}
実はどのクラスもMonoBehabiourを継承していることになっている。 MonoBehavioourは「Unityのプログラムに関連付けて動くクラスのために必要な機能をまとめたもの」

C#インスタンスの作り方
  • クラス名 変数名;
  • 変数 = new クラス名();
    下のように宣言と初期化を同時に行うことも出来る。
  • クラス名 変数 = new クラス名();
文字+数値

C#だと文字列+数値は数値が文字列に変換されて連結されます。(確かJavaScriptもそうだった)

String str;
str = "200" + 9;

という文があったら
strの中身は"2009"です。

C#の配列の宣言

タイプ名 “"変数名;
宣言と初期化は下記の通り
タイプ名 ”
“ = new タイプ名 [保管する値の数]
タイプ名 ”[]“= { 値1, 値2}

string [] arr = {"Hello", "welcome", "Bye"} 
列挙型

いくつか用意されている値だけを使える特別な型。型そのものを自分で作れる。
列挙型のタイプを作成する

enum 型名 {値1, 値2, ・・・・・・}

本に書いてある列挙型よりも分かりやすく説明しているサイトがあったのでこっちを参考にしたほうが良さそう
あとenumはメソッドの中には書けず、予め用意しておく必要があるのでvoid startの中には書けません!

連載:C#入門 第16回 列挙型の活用(1/4) - @IT

Chapter3 ゲームオブジェクトを操作しよう!

Vector3について

Vector3とは横、縦、奥行きを表したベクトルのこと

transform.Translate と transform.positionの違い

下記はどちらもオブジェクトを動かくスクリプトですが
transform.Translateは変化量を渡します。

Vector3 p = new Vector3(0,0,0.1f);
transform.Translate(p);

対してtransform.positionは位置を渡します。

zvalue += 0.1f;
Vector3 p = new Vector3(0,0,zvalse)
transform.position += p;
回転させたい場合は
transform.Rotate
Vector3 v = new Vector3(0.1f,0,0)
transform.Rotate += v;
大きさはを変えたい場合は
ltransform.localScale
Vector3 v = new Vector3(0.1f,0,0)
transform.localScale += v;
Input系

Input.GetKey(KeyCode.UpArrow)…矢印キーの上
Input.GetKey(KeyCode.A)…Aキー

よく使うやつ Input.GetAxis(“Horizontal”);
Input.GetAxis(“Vertical”);

x = Input.GetAxis("Horizontal");
y = Input.GetAxis("Vertical");
Vector3 v = new Vector3(x, y, 0);
transform.Translate(v);

GetAxis(“Horizontal”)はゲームパッドまたはキーボードの←→キーによって-1~1の値を返す。

Input.mousePosition

マウスポインタの位置を示します。

Vector3 pos = Input.mousePosition;
pos.z = 3.0f;
Vector3 newpos = <camera>.ScreenToWorldPoint(pos);

※ただしmousePositionで得られた値は画面上の位置であり、Rayでオブジェクトの当たり判定を行う場合は絶対座標に変換する必要がある。

Rayについて

Rayはある地点から、無限に伸びる見えない直線のこと。本よりも分かりやすい使い方をしているサイトがあったからそのまま引用します。

void RayTest()
    {
        //Rayの作成       ↓Rayを飛ばす原点   ↓Rayを飛ばす方向
        Ray ray = new Ray (transform.position, new Vector3 (0, -1, 0));

        //Rayが当たったオブジェクトの情報を入れる箱
        RaycastHit hit;

        //Rayの飛ばせる距離
        int distance = 10;

        //もしRayにオブジェクトが衝突したら
        //                  ↓Ray  ↓Rayが当たったオブジェクト ↓距離
        if (Physics.Raycast(ray,out hit,distance))
        {
              //Rayが当たったオブジェクトのtagがPlayerだったら
                if (hit.collider.tag == "Player")
                Debug.Log ("RayがPlayerに当たった");
        }
    }

引用元
Rayを飛ばして当たったオブジェクトの情報を得る方法 - Qiita

Rigitbodyを埋め込んだオブジェクトに力を加える
transform.GetComponent<Rigidbody>().AddForce(0, 0, 1);

※Rigitbodyなどのコンポーネントは元からあったわけでなく、「後から追加したコンポーネント」です。こうしたコンポーネントスクリプトで制御する場合にはGetComponentする必要があります。

GetComponent<クラス>():
名前によるゲームオブジェクトの取得
GameObject 変数 = GameObject.Find("変数");

※find系は重くなる原因となるため極力使わない
findの代替案
public変数、もしくはSerializeFieldアトリビュートをつけた変数を定義し、オブジェクトを予めunityのInspecterからアタッチしておく。
インスペクタ上でオブジェクトを貼り付けられることも知らなかった….。どうでもいいですけど

public Camera camera;

って宣言すると

f:id:kurome-stdio:20170506231311p:plain

カメラのオブジェクトしか貼れないけど

public GameObject camera;

って宣言すると

f:id:kurome-stdio:20170506231336p:plain

カメラ以外のオブジェクトも以外のゲームオブジェクトも貼れるんですね。どっちがいいんだろ….。
ここまでの知識でビリヤードみたいな物を作ることが出来るみたいです。ってことで3章の最後にあるビリヤード作りもやりました

f:id:kurome-stdio:20170506231836p:plain

f:id:kurome-stdio:20170506231850p:plain

カメラはRotateAroundというメソッドを使ってオブジェクトの周りを動くようになっています。
これはある地点を中心にして、決まっただけ離れた場所を回転させるメソッドです。

transform.RotateAround(中心位置, 距離, 回転角度)

本ではガッツリ三角関数を使ってカメラの位置を移動させてますね。(カメラ制御難しい…)

終わりに

この本には4章と5章と6章があるのですが、自分が読んだのは4章の途中までです。というのも訳あって去年の8月の終わりまでに3Dアクションゲームを作る必要があったため途中で3Dアクションゲームに特化した本に切り替えてしまったからです。残りの方をサラッと読んだ感じアニメーションクリップの話とかコライダーの話とかあって重要そうな感じがするので今度ちゃんと読もうと思っていたのですがまだ読んでません…。あと自分が大切だと思ったところをまとめたのですが結構な量になってしまいました。まとめるのに思った以上に時間がかかったので最初のところとかもっと適当で良かったかも。

おまけ

本とは全く関係ないです

Unityのコンソールを色付け
Debug.Log ("<color=yellow>黄色のログ</color>");
Debug.Log ("<color=#0033ff>カラーコードのログ</color>");
macC#コンパイル、実行

monoが入っていなかったら

brew install mono
$ mcs hello.cs
$ mono hello.exe

参考文献

enum (C# リファレンス) | Microsoft Docs

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

Unity開発で気をつけておきたい7つの事 -2015年版- - 渋谷ほととぎす通信

MacでC#をコンパイル、実行 | nkmk log