はきだめ

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

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

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

目次

1. C#の文法

  • 整数

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

    • float - 32ビット幅の値
    • double - 64ビット幅の値

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

数値
123 int
123.0 double
123.0f float

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

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

文字+数値

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

インスタンスの作り方

クラス名 変数名;
変数 = new クラス名();

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

クラス名 変数 = new クラス名();


2. Unityの基本的なこと

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

回転
Vector3 v = new Vector3(0.1f,0,0)
transform.Rotate += v;
大きさの変更
Vector3 v = new Vector3(0.1f,0,0)
transform.localScale += v;
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;
キー入力待ち
Input.GetKey(KeyCode.UpArrow) //↑キー
Input.GetKey(KeyCode.A)  //Aキー

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

Input.GetAxis("Horizontal");
Input.GetAxis("Vertical");
x = Input.GetAxis("Horizontal");
y = Input.GetAxis("Vertical");
Vector3 v = new Vector3(x, y, 0);
transform.Translate(v);
マウスポインタ

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

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

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

Rayについて

Rayはある地点から、無限に伸びる見えない直線のこと。

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

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

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

        //もしRayにオブジェクトが衝突したら
        // Raycast(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系は重くなる原因となるため極力使わないほうがいい

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //これが無いとエラーが出ます

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

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

そして先程作ったtextオブジェクトこのスクリプトを貼り付ける

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

終わりに

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

その他

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

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

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

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

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

参考文献

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

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

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

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