はきだめ

主にプログラミングに関することをかきます

Unity本を読んだのでまとめる

Unity本を買いました。なかなかの良本だったので自分用に大事だと思ったところをまとめます。

変数の方について

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

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

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

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

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

と判定されるみたいです。floatにするときはfをつけよう。

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

画面内にテキストを表示させる

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コンポーネント…Unityのテキストに関する機能が集まった部品 オブジェクト…独立して扱うことの出来るプログラムのかたまり。メソッドと値(フィールド)を持ったもの。ゲームはシーン、モデル、証明、カメラといったオブジェクトの集まりで出来ている。 クラス…オブジェクトの設計図。

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

C#インスタンスの作り方
クラス名 変数名;
変数 = new クラス名();


下記のように宣言と初期化を同時に行うことも出来る。

クラス名 変数 = new クラス名();
文字+数値

C#だと文字列+数値は数値が文字列に変換されて連結される

String str;
str = "200" + 9;
// str => "2009"
C#の配列の宣言
タイプ名 "[]"変数名;

宣言と初期化は下記の通り

タイプ名 "[]" = new タイプ名 [保管する値の数]
タイプ名 "[]"= { 値1, 値2}
string [] arr = {"Hello", "welcome", "Bye"} 
列挙型

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

列挙型のタイプを作成する

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

enumはメソッドの中には書けず、予め用意しておく必要がある

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

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;
回転させる
Vector3 v = new Vector3(0.1f,0,0)
transform.Rotate += v;
大きさはを変える
Vector3 v = new Vector3(0.1f,0,0)
transform.localScale += v;
キー入力待ち
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の値を返す。

マウスポインタ

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

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

オブジェクトを動かす(力を加える)
transform.GetComponent<Rigidbody>().AddForce(0, 0, 1);

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

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

※find系は重くなる原因となるため極力使わないほうがいい

終わりに

c#とunityの基礎的な部分を学べたので最初の一冊としてはかなり良かったのではないかと思います。

その他

デフォルトのエディタを変更する

scriptを開いたときにデフォルトで開かれるエディタは変更することが出来る。
Unity→Preferenceを選択して

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

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

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