31
31

More than 5 years have passed since last update.

[超初心者向け]UnityでのC#の基礎(2)class

Last updated at Posted at 2016-06-15

Unityは「ゲームを簡単に作れるようにする」ソフトですが、他のプログラミング経験がないままで利用するとScriptが分からなくてつまずいてしまいます。ここでは、Unityで利用するC#に絞って、Scriptの仕組みを解説します。
Scriptのエディタで出てくる簡単な解説は以下で記していますので、一度読んでからこちらを参考にして下さい。

[超初心者向け]やっと納得、Unityを初めて触ると出てくるC#の何だあれの答え

これだけでは「なんとなく分かる」程度なので、制作するには更に知識が必要です。
ここでは最低限の知識を書きます、学習の糸口として利用してください。

この記事は以下でシリーズしていますので、適宜、参照してください。
UnityでのC#の基礎

束ねてまとめるclass

リファレンスを見ていくと、ほとんどのページにclassstructが書いてあります。これは使い方が違いますが、「データとメソッド(処理をする部分)をまとめる」ものです。関連するものをまとめていると、便利なものを、Unityでは予めまとめて作っています。

classの基本

例えば、Transformを見てみると、以下のように書いてあります。

Transform
class in UnityEngine/継承元:Component

引用元:http://docs.unity3d.com/ja/current/ScriptReference/Transform.html

これは、Transformという名前のclassをUnityで用意してますよ、という宣言です。「継承元」とは、classは継承という形で、元にあるものから別のものを定義する機能があります。Componentと書いてあるので、このTransformComponentの内容を継承し、更に何かを付け加えたものであることが判ります。実際には、UnityEngineの中では以下のように書いてある筈です。

class Transform : Component{

//このクラスの中身がここに入る

};
  • classはC#の予約語で、この後に在る識別子がclass名です。
  • その後ろに在る:と、それに続く識別子が`派生する元のclass名(基底クラス)です。
  • {}に囲まれた部分に在るものを「ブロック」と呼び、このclassの中身を定義しています。

自分でScriptコンポーネントを追加した場合、以下のようなソースコードが出来上がります。これも同じです。

Hogehoge.CS
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

と書いてあります。この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は以下のようになります。

Transform.position
public Vector3 position;

この場合は、更にVector3という型を調べると、構造体(struct)であることが判ります。

参考:http://docs.unity3d.com/jp/current/ScriptReference/Vector3.html

この構造体はまたメンバを持っています。そのx座標は以下のようになっています。

Vector3.x
public float x;

引用元:http://docs.unity3d.com/jp/current/ScriptReference/Vector3-x.html

これにアクセスしたい場合は、ドット演算子「.」で結んで指定します。

sample
float xTemp = transform.position.x;

このように型が何かを調べて適宜、値を参照しましょう。

C#の基本仕様はこちらが参考になります。
https://msdn.microsoft.com/ja-jp/library/ms173118.aspx

メソッド

  • classのメンバで、何らかの処理をするメンバーを「メソッド」と呼びます。
  • フィールドとの記述の違いは、名前の後ろに()が在るか否かです。
  • 「メンバ関数」とよぶ場合も在ります。
  • Unityリファレンスでは「Public 関数」「Static関数」を示しています。

Public関数

  • 関数にはPublicでは無いprivateの関数も存在しますが、UnityEngineで定義されたclassを用いる場合、利用できるのはPublicのみになります。

Transforamでは、以下を例に取ります。

Transform.Translate
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を用いて、以下のように記します。

サンプル(1)Transform.Translate
Vector3 v = new Vector3(10.0f, 2.5f, -5.0f);
transform.Translate(v);

これを同じ処理が以下の形でも可能です。

サンプル(2)Transform.Translate
transform.Translate(10.0f, 2.5f, -5.0f);

使い分けは、どちらの形で使いたいかによります。

static関数

  • クラスごとに唯一つの実体を持ち、すべてのインスタンス(classをコンポーネントなどで実体化したもの)の間で共有されます。
  • classを破棄する Destroyのように、同じ処理しかしないもの、一つあれば構わないものに向いています。
  • Staticの場合、クラスに属するメソッドになるので、GameObject.Destroy( this );というようにclass名に続けて指定します。

この記事は以下でシリーズしていますので、適宜、参照してください。
UnityでのC#の基礎

31
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
31