Unityは「ゲームを簡単に作れるようにする」ソフトですが、他のプログラミング経験がないままで利用するとScriptが分からなくてつまずいてしまいます。ここでは、Unityで利用するC#に絞って、Scriptの仕組みを解説します。
Scriptのエディタで出てくる簡単な解説は以下で記していますので、一度読んでからこちらを参考にして下さい。
[超初心者向け]やっと納得、Unityを初めて触ると出てくるC#の何だあれの答え
これだけでは「なんとなく分かる」程度なので、制作するには更に知識が必要です。
ここでは最低限の知識を書きます、学習の糸口として利用してください。
この記事は以下でシリーズしていますので、適宜、参照してください。
[UnityでのC#の基礎]
(http://qiita.com/JunShimura/items/f87c599b3738b804f605#unity%E3%81%A7%E3%81%AEc%E3%81%AE%E5%9F%BA%E7%A4%8E)
#束ねてまとめるclass
リファレンスを見ていくと、ほとんどのページにclass
かstruct
が書いてあります。これは使い方が違いますが、「データとメソッド(処理をする部分)をまとめる」ものです。関連するものをまとめていると、便利なものを、Unityでは予めまとめて作っています。
#class
の基本
例えば、Transform
を見てみると、以下のように書いてあります。
Transform
class in UnityEngine/継承元:Component
引用元:http://docs.unity3d.com/ja/current/ScriptReference/Transform.html
これは、Transform
という名前のclass
をUnityで用意してますよ、という宣言です。「継承元」とは、classは継承という形で、元にあるものから別のものを定義する機能があります。Component
と書いてあるので、このTransform
はComponent
の内容を継承し、更に何かを付け加えたものであることが判ります。実際には、UnityEngineの中では以下のように書いてある筈です。
class Transform : Component{
//このクラスの中身がここに入る
};
-
class
はC#の予約語で、この後に在る識別子がclass名です。 - その後ろに在る
:
と、それに続く識別子が`派生する元のclass名(基底クラス)です。 -
{
と}
に囲まれた部分に在るものを「ブロック」と呼び、このclassの中身を定義しています。
自分でScriptコンポーネントを追加した場合、以下のようなソースコードが出来上がります。これも同じです。
using UnityEngine;
using System.Collections;
public class Hogehoge : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
##継承とは
特定の属性などで共通化できる部分をまとめて作ったclassを基底クラスにして、派生するclass
をつくることで、効率のよく質のいいプログラミングができます。Component
は、UnityエディタでScene内にあるGameObject
にくっついているものです。Unityのエディタでは、メニューのComponent
から色々なものを追加すると、Inspectorで並びます。あたり判定を処理するCollider
や色などを保持するRenderer
なども同じようにComponent
を基底クラスにしています。
Renderer
class in UnityEngine/継承元:Component
引用元:http://docs.unity3d.com/ja/current/ScriptReference/Renderer.html
##メンバーの種類
クラスの{
と}
の間に囲まれているブロックの中に、メンバーを定義します。ここに入るもので主なものは、データを記憶するフィールドと、何らかの処理をするメソッドです。
###フィールド
- Unityのリファレンスでは「変数」と記されています。
- 変数などの値の記憶する部分を作ります。これは値を得られたり、代入する対象です。
例えば、Transform.childCount
の説明をみると、
public int childCount;
引用元:[http://docs.unity3d.com/jp/current/ScriptReference/Transform-childCount.html]
(http://docs.unity3d.com/jp/current/ScriptReference/Transform-childCount.html)
と書いてあります。このchildCount
は、
public |
int |
childCount |
---|---|---|
外部から参照可能 | 整数型 | 変数名がchildCount |
と定義されています。これを参照する場合、以下のようになります。
using UnityEngine;
using System.Collections;
public class Hogehoge : MonoBehaviour {
public Transform playerTransform;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
int count = transform.childCount;
if(prayerTransform.childCount==count)
{
//プレイヤーの子の数と自分の子の数が同じ場合の処理
}
}
自分のClassの外に在るものを覗き見る場合は、外部のクラス名とドット演算子「.
」で結んで指定すれば可能です。
単純な変数型で無い場合もあります。例えば、Transform.position
は以下のようになります。
public Vector3 position;
この場合は、更にVector3
という型を調べると、構造体(struct
)であることが判ります。
参考:http://docs.unity3d.com/jp/current/ScriptReference/Vector3.html
この構造体はまたメンバを持っています。そのx座標は以下のようになっています。
public float x;
引用元:http://docs.unity3d.com/jp/current/ScriptReference/Vector3-x.html
これにアクセスしたい場合は、ドット演算子「.
」で結んで指定します。
float xTemp = transform.position.x;
このように型が何かを調べて適宜、値を参照しましょう。
C#の基本仕様はこちらが参考になります。
[https://msdn.microsoft.com/ja-jp/library/ms173118.aspx]
(https://msdn.microsoft.com/ja-jp/library/ms173118.aspx)
###メソッド
-
class
のメンバで、何らかの処理をするメンバーを「メソッド」と呼びます。 - フィールドとの記述の違いは、名前の後ろに
()
が在るか否かです。 - 「メンバ関数」とよぶ場合も在ります。
- Unityリファレンスでは「Public 関数」「Static関数」を示しています。
Public関数
- 関数には
Public
では無いprivate
の関数も存在しますが、UnityEngineで定義されたclassを用いる場合、利用できるのはPublic
のみになります。
Transforam
では、以下を例に取ります。
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
引用元:http://docs.unity3d.com/jp/current/ScriptReference/Transform.Translate.html
このPublic関数は指定したベクトルによってTransformを移動させる処理を実行します。
public |
void |
Translate( |
Vector3 translation |
Space relativeTo = Space.Self |
); |
---|---|---|---|---|---|
外部から参照可能 | 戻り未指定 | メソッド名がTranslate | 一つ目引数がVector3型 | 相対指定(未指定は自分) | 終わり |
2種類が在るのは、同じ名前で引数(渡すパラメータ)を複数の種類、用意している「オーバーロード」という仕組みです。一つ目の場合はVector3
を用いて、以下のように記します。
Vector3 v = new Vector3(10.0f, 2.5f, -5.0f);
transform.Translate(v);
これを同じ処理が以下の形でも可能です。
transform.Translate(10.0f, 2.5f, -5.0f);
使い分けは、どちらの形で使いたいかによります。
static関数
- クラスごとに唯一つの実体を持ち、すべてのインスタンス(classをコンポーネントなどで実体化したもの)の間で共有されます。
- classを破棄する
Destroy
のように、同じ処理しかしないもの、一つあれば構わないものに向いています。 - Staticの場合、クラスに属するメソッドになるので、
GameObject.Destroy( this );
というようにclass名に続けて指定します。
この記事は以下でシリーズしていますので、適宜、参照してください。
[UnityでのC#の基礎]
(http://qiita.com/JunShimura/items/f87c599b3738b804f605#unity%E3%81%A7%E3%81%AEc%E3%81%AE%E5%9F%BA%E7%A4%8E)