【Unity】Unityの取得がざっくりわかるはなし

 Unityで調べごとをしていると度々”取得”という言葉を見かけると思います。当記事群でもよく使っています。今回はその言葉の意味のイメージをまとめます。

 先にざっくり言ってしまうと次のようになります。
・取得は訊き出すこと

 意味がわからないと思いますので噛み砕いていきますが、オブジェクトとスクリプトの関係については「Unity入門前に知っておくといいはなし」をご一読いただければと思います。

 Unityで何かを作ろうとしたときオブジェクトやコンポーネントはいくつも登場させる必要があります。例えばキャラとアイテム。

 ”キャラがアイテムにふれたら体力を回復する”というプログラムを作りたいとしましょう。このときキャラは”自分がふれているものは何か?”を知る必要があります。

 こんなときアイテムに”あなたの名前は?”と尋ねて名前を教えてもらえれば解決しそうですね。ざっくり言ってしまうとこのように自分の持っていない情報を訊き出すのが取得です。さらにここからいつでも訊き出せる状態にすることも取得と呼んだりします。いつでも訊き出せる状態にするというのは予めオブジェクトを指定してニックネームを付けておくような処理です。
 ここではオブジェクトの名前を例に出しましたが、他にもオブジェクトがアクティブかどうか?オブジェクトの持つTransform【トランスフォーム】コンポーネントの位置座標のYはいくつか?オブジェクトに設定されているマテリアルの色のR値はいくつか?オブジェクトの持つ自作スクリプトの中で宣言されている変数の値はいくつか?などが取得できます。


 つまり何でも訊き出すことができます。

 いかがでしたか?あまり聴き慣れずイメージも湧きにくい言葉ではあると思います。取得にはオブジェクトとコンポーネント、そしてその中の変数などを適切に指定する必要があります。
 しかし裏を返せばこれらを適切に指定するだけでゲーム内のあらゆるパラメータを掌握しゲームに活用することができます。
 急に理解するのは無理ですが、参考にするスクリプトを読むときもただ真似するだけでなく、誰の何のパラメータを読み書きしているのかを少し意識していけるといいかもしれません。

【Unity】スクリプトの全体レイアウトのはなし

 Unityでスクリプトを書く際のセオリーをまとめました。厳密なルールはほとんどありませんが、NGを覚えるよりBestを覚えるほうが得策です。
 まずスクリプトを作成すると下記のようなソースコードが自動的に書かれた状態になります。スクリプトの作り方を知りたい方は「【Unity】スクリプトの作成と追加」を参考にしてください。

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

public class otameshi : MonoBehaviour{
    void Start(){
    }

    void Update(){
    }
}

 otameshiの部分はスクリプトのファイル名で作られているはずです。その中のStart【スタート】関数とUpdate【アップデート】関数はよく使うので書いてくれている部分です。使わなければ書かなくても構いません。逆に必要であれば他の使える関数を使うこともできます。自分で関数を作ることもできます。それを踏まえて全体のレイアウトを図にまとめました。

using なんたら
 あまり書き換えることはありません。名前空間などと呼んだりしますが共通の言葉をまとめた辞書のようなものだと思っておいてください。

クラス宣言
 あまり書き換えることはありません。クラス名とファイル名は同じにするルールです。基本的に自動生成されたままで構いませんが、ファイルを複製などした場合はご注意ください。

変数宣言など
 そのクラスで使う変数の宣言などを書きます。Update関数内で宣言すると毎フレームリセットされてしまうので、ゲーム中保持したい変数などはこのエリアで書きます。

Start関数
 最初に一度だけ実行されます。これから使うオブジェクトやコンポーネントの設定などを書いたりします。ゲームの開始時というと少し語弊があるのですがいずれ他の記事にまとめられたらと思います。

Update関数
 起動中常にずっとやる処理を書きます。毎フレームですので設定が60fpsなら1秒間に60回処理することになります。リアルタイムな変化を作る部分ですので一番書き込む部分と言っても過言ではありません。

その他の関数
 自作した関数は勿論、最初から書かれていなくてもいくつか使える関数があります。便利なものでいうとAwake【アウェイク】関数、OnEnable【オンイネイブル】関数、FixedUpdate【フィックスドアップデート】関数、LateUpdate【レイトアップデート】関数などがあります。習得してしまえばより詳細にタイミングをコントロールできますが、最初から覚える必要は全くありません。

 少し長くなってしまいましたが、実際に書きながら少しずつ実感の湧いてくるものになります。一度に覚えようとせず実践しながら都度この記事の図を確認しに来ていただければと思います。

【C#】代入のはなし

 プログラムをソースコードで書き始めて違和感のあるポイントの1つ、イコール記号”=”についての記事です。
 ”=”自体は算数や数学で見慣れた記号ですがプログラムではそもそも別物です。ニュアンス的に共通する部分もありますがそもそも別物として学びなおしたほうがむしろわかりやすいかと思います。尚、これは”代入“という変数の操作ですので先に「変数がざっくりわかるはなし」をご一読いただければと思います。

 算数や数学での”=”は等価を表します。等価というのは”=”の右と左が同じという意味です。特に算数では”計算式=計算結果”という使い方がメインだと思います。

 一方でプログラム(この記事ではC#)での”=”は代入という操作を意味します。
  「変数がざっくりわかるはなし」 と同様にコップを例に出して話を進めると、コップに入れておく水の量を変える操作です。例えば空のコップaがあるとして

a = 50;

のような記述のイメージは下の図のようになります。

 他にもいくつか例を並べてみましょう。

 あまり実感が湧きづらいかとは思いますが要は代入とは
「コップの中を今から言う量にしてくれ」
という命令です。

 つまり量を明確に指定する必要があります。「50にしてくれ」「20と30を足した量にしてくれ」「あっちのコップbと10を足した量にしてくれ」といった具合です。
 指定した量だけ注ぎ足したり捨てたりしたいときは最後の例のように「今のコップaから20だけ引いた量にしてくれ」という表現になります。量の計算にそのコップ自身も使えるわけですね。

 いかがでしたか?始めは記号からイメージがしづらいですが慣れてしまえばそれほど難しいものではありません。序盤にも書きましたがとりあえず算数の”=”と別物と思って使っていればすぐにマスターできると思います。

【Unity】Vector3がざっくりわかるはなし

 先にざっくり言ってしまうとVector3は
3座標よくばりセットです。

 意味がわからないと思いますので噛み砕いていきますが、座標や次元という言葉がピンとこない方は先に「座標と次元がざっくりわかるはなし」をご一読ください。また、変数についても「変数がざっくりわかるはなし」でご一読いただければと思います。

 XYZで示される座標は3つ揃ってやっと1つの情報になっています。もし突然「3階に集合」と言われてもどこのビルかわからなければ誰も到着できないようにどれか1つの座標情報だけでは活用先は限られます。

 そこで3つの変数をセットにしているのがVector3です。
 色々と便利な機能もあるのですが、本来の役割は本当にただそれだけです。

少し具体的に

 全ての座標を0でatsumareという名前で宣言する(作る)場合次のように書きます。

Vector3 atsumare = new Vector3();

 最初からXYZ =(30, 50, 3)で宣言したいときは

Vector3 atsumare = new Vector3(30, 50, 3);

 XYZそれぞれの値を知りたいときは次のように書けば利用できます。

atsumare.x
atsumare.y
atsumare.z

 特定の座標の値を変えることもできます。

atsumare.x = 100; //X座標を100にする
atsumare.y = atsumare.y + 1; //Y座標を1増やす 

 また、変数otameshiにatsumareのx座標を入れたいなら

float otameshi;
otameshi = atsumare.x;

 このようにVector3の名前に.xや.yを付け足すだけで普通の変数と同じように座標を操作することができます。

 1つよくある落とし穴のポイントとしてはTransform【トランスフォーム】コンポーネントで定義されているPosition【ポジション】などはVector3型ですが直接座標を操作できない点です。

//よくあるエラーのパターン
gameObject.transform.position.x = 100;

 これは一旦別のVector3型の変数を宣言してそれを代入することで解決できます。

//エラー回避サンプル
Vector3 otame = new Vector3(100, 0, 0); //(100,0,0)で初期化
gameObject.transform.position = otame;

//X座標以外いじりたくないなら
Vector3 otame2 = gameObject.transform.position; //ポジションを代入
otame2.x = 100;                                 //X座標だけ100に
gameObject.transform.position = otame2;

 勿論上記のサンプルは一例です。使い所や作りたいプログラムによって最適な書き方は変わります。

変数がざっくりわかるはなし

 プログラムをつくる上でほぼ避けて通れない概念の1つ、「変数」についての記事です。

 先にざっくりしたイメージでいうと
変数コップみたいなものです。

 コップは中に色んな量の水を入れておけます。
 変数の機能はシンプルにただそれだけなのです。大きく2つにわけてまとめてみました。

①量を変える
 水の量を増やしたり減らしたりできるように、変数の数値も変えることができます。+10したり100ぴったりにしたりという命令ができます。

②量を読み取る
 水がどのぐらい入っているか測ることができるように、変数の数値も読み取ることができます。注意したい点は水の量を変えてしまうとさっきまでの量がわからなくなることです。逆算しない限り今の量しか読み取れません。

 プログラムではこのコップ同士を比べたり、その結果に応じて命令を変えたりして変数を利用します。活用法は色々あるのですが、最初はざっくりコップのようなものだと思っていただければ大丈夫です。

座標と次元がざっくりわかるはなし

 ゲーム作りではとても重要な概念の1つ、「座標」についての記事です。

 先にざっくり言ってしまうと、
座標とは「ココ!」を正確に伝えるための決まりです。

 意味がわからないと思うので噛み砕いていきます。
 あなたは今まっすぐな一本道を歩いているとします。駅から伸びる道沿いには建物が並んでいますが、どれがゴールかわかりません。しかし「駅から50m」という情報を持っていればどうでしょう。これならなんとなくわかるかもしれません。
 もし駅に立てる看板に何の図もなく「ココ!」という文字しか書かれていなかったら誰もゴールできません。でも看板に「この先50m」と書いてあればみんなゴールできそうですね。この50mのように数値で伝えることができるのが座標です。

 続いて今度は下の地図のようなゴールを看板で伝えてみましょう。

  トータル80mでも交差点がいくつかあればどこで曲がっていいかわからなくなってしまいそうです。 30mと50m、どうしても2つの数値が必要になりそうです。このようにそれぞれ別の意味を持つ2つの数値が必要になるものを二次元と呼んだりします。逆に言うと「平面上のココ!」は2つの数値だけで伝えることができるのです。

 さて、ゴールに到着しても建物が40階建てのビルだとしたらどうでしょうか。高さを伝える必要がありますね。今度は第3の数値として「何階か?」という情報があれば良さそうです。こうなると別の意味を持つ数値が3つになったので三次元です。二次元のときと同様に「空間上のココ!」3つの数値があれば伝えることができます。

 このように数値で伝えるための決まりが座標です。
 実際はもっと少ない情報で正確に伝わるように単位を統一したり符号を付けたりします。次元は英語でDimension【ディメンション】なので2D、3Dなんて呼んだりもします。
 冒頭に書いた 「ココ!」を正確に伝えるための決まりという意味がなんとなくイメージできていれば幸いです。

【Unity】よく使うウィンドウとその役割

 Unityの最初の取っ付き辛さはそのごちゃついた画面だと思います。そこで今回はそもそもの画面構成とよく使うウィンドウ及びその役割をまとめました。

 皆さんが普段パソコンを利用するとき、何気なく複数のウィンドウを出すことはあると思います。例えば写真を探すウィンドウと写真を表示するウィンドウを同時に出したりなどです。
 実はUnityの画面の中にもこれと同じように複数のウィンドウが詰め込まれています。Unityは色々なことができるツールですからその役割ごとにウィンドウが別れているのです。ウィンドウ名のタブや枠線を掴んで動かすことでレイアウトやスペースはいつでも自由に変えられます。
 それぞれのウィンドウ名左上に書いてあります。同じエリアに複数重ねている場合はタブだけが見える状態になります。

よく使うウィンドウ6つを簡単にまとめてみました。

Scene【シーン】
 オブジェクトの位置関係を確認したり調整する画面。実際のプレイ画面ではない。
Game【ゲーム】
 カメラオブジェクトから見える実際のプレイ画面。
Hierarchy【ヒエラルキー】
 編集中のシーンに登場するオブジェクトのリスト。
Inspector【インスペクター】
 選んでいるオブジェクトやファイルの詳細情報。確認だけでなく編集できるものもある。コンポーネントの追加や編集もここ。
Project【プロジェクト】
 プロジェクトフォルダの整理画面。ゲームに使う素材をまとめて管理するための画面。
Console【コンソール】
 エラーやデバッグ用のログを表示させる画面。

 Unityでは書籍やブログ記事を参考にすることも多いと思いますが、この最低限の構成がわかっていればレイアウトが違ったり情報が省略されていても参考にすることができるかと想います。

Unity入門前に知っておくといいはなし

「Unityはコンポーネント指向」

 どこで誰から聴いた言葉か忘れてしまいましたし、この言葉の使い方には議論の余地があるかもしれません。しかし長い間闇雲に調べつつUnityを使っていた私の中の濃い霧を晴らしてくれた言葉であることには間違いありません。実際の操作手順や画面構成、有用なクラスなどはさておき、今回の記事ではこの「コンポーネント指向」という言葉について噛み砕いてお伝えできればと思います。

 ゲームにはだいたい物体(オブジェクト)があります。それは地面であったりアイテムであったりキャラクターであったり。パズルゲームでもパネルなどがそれにあたります。

 さて、そこで1つ質問です。地面とキャラクターの違いは何でしょうか。
 「当たり前じゃないか」と思うかもしれませんが、少し考えてみてください。まず見た目が違いますね。他には?キャラクターは色々なポーズが取れますね。キー入力で操作することもできるかもしれません。

 実はこの物体ごとの持つ1つ1つの性質コンポーネントで作られています。
 ゲームの開発者はこうしてコンポーネントを決めていくことで、様々な物体を作っていくことになります。 コンポーネントはスクリプトと呼ばれるプログラムのソースコードの塊として作ります。つまり 逆に言えばコンポーネントを自在に使えば割とどんなものでも作り出すことができます。

 コンポーネントで物体を作るメリットの1つに流用しやすいという点があります。例えば、キャラクターに足場のないところで落下する性質を付け加えたとします。隣に武器が浮いていたらこれはヘンですよね。
 もし物体ごとに落下のプログラムを書いていたとしたら武器にも同じプログラムを書き加える必要があります。しかし「落下のコンポーネント」を1つ作っておけばこれを武器に追加するだけで実装できます。

 ちなみにUnityでは落下のようによく使うコンポーネントは最初から用意してくれています。このような便利な機能を利用させてもらいながらゲームを制作するのがUnityでの流れですが、他人の書いたコードに頼って作っていることは忘れてはいけません

 さて、コンポーネントで様々な物体を作ってもただ眺めるだけではゲームとは呼べません。実際にゲームを作るとなるとスクリプトから他のコンポーネントの持つ数値を操作したいなという場面が多々でてきます。例えばキー入力でキャラを動かしたい場合。自作のスクリプトからトランスフォームというコンポーネントのローテーション(回転)の値を使って計算し、ポジション(座標)の値を変更する必要があります。具体的な記述方法は今回省きますが、この「オブジェクト.コンポーネント.変数」という構造さえわかってしまえば、あとは変数の読み出し・書き込みと同じです。

 いかがでしたか?普段は聞き慣れない言葉ですが少しでも「コンポーネント」という概念が見えていたら幸いです。小手先の操作や手順の羅列ばかりでは見えて来づらいところですが、Unityを使うとき自分が何をしているのか知っておくだけでもずっと見通しを持って制作に取り組めるかと思います。

電圧と電流のはなし

今回は電気を測る単位の「電流」と「電圧」ついて紹介します。
 「乾電池のはなし」ページを読んでくれた方は、すでに電圧という言葉は見ましたね。そこで電圧は「電気を流そうとする力」と表現していました。でもそれだけではイメージがしづらかった方もいるかと思います。今回の記事では例え話で電気というもののイメージをなんとなく掴んでもらうことが目的です。

 よく電気に関する本を読むと、電気を水に例えて説明しています。実際これはとてもいい例え方で、電気の色々な性質についてつじつまが合います。ですが、水に例えられてもピンと来ない方のために、あえて今回は違うものに例えてみます。これは少し無謀な試みで、あまりいい例えとは言えません。ですから、電気のあらゆる性質についてカバーできるものではないことを、先に断っておきます。

 今、あなたはゲレンデ(スキー場)にいるとします。まずリフトで山頂まで登ってきました。山頂まで来たあなたは次に何をしますか。滑りましょう。滑るだけなら歩くのに比べて、ずっと少ない体力で長距離を移動できますね。ゲレンデでは高いところから低い所に向かって滑ります。板をつけたまま逆に登るのは大変な苦痛です。つまり、基本的にはみんな決められたコースの上を同じ方向に進みます。

 さて、脳内ウィンタースポーツを堪能したところでもっと想像を膨らましてみましょう。
 まず、あなたの移動した標高差について考えてみましょう。リフトに乗って山頂まで行くことで、あなたは何ができるようになったでしょうか。滑ることができるようになりましたね。
 また、リフトで登った山の高さと、あなたが滑った高低差が大体同じになるのも、なんとなく想像できますね。ここでは「高さ」だけに注目し、「横」の移動距離は無視してください。
 人数はどうでしょうか。リフトを降りた人数とリフト乗り場まで滑ってきた人数。これは必ず同じになりますね。(どこかで誰かが遭難していなければ……。)

 そろそろ電気の話に置き換えていきましょう。
 まず、この話の主役であるスキーヤー・スノーボーダーさんが「電気」です。彼らを高いところへ運んだリフトが「電池」で、舞台であるゲレンデは「電子回路」です。ちなみにこの高さを「電位」と呼びます。つまり電子回路とは、電池で電位の高いところに運ばれた電気が、滑り下りていくループみたいなもの、とイメージできます。

 では電気を流そうとする力の「電圧」とは一体何でしょうか。
 リフトに乗る前のあなたとリフトを降りた後のあなた、その決定的な違いは高さですね。高さが違うと何ができるようになったでしょうか。滑ることができるようになりました。電気に置き換えてみましょう。電池で電位の高いところに送られた電気は、電位の低い所に流れることができるようになりました。これを「電圧がかかっている」と表現します。高い所にあるものには低い所へ向かう力が働いているのです。「電気を流そうとする力」という言葉の意味が少しでもイメージできたでしょうか。

 最後に、リフトに乗った人数についても考えましたね。実はこれが「電流」にあたります。リフトを降りた人数とリフト乗り場まで滑ってきた人数。これは全て同じでした。つまり、電子回路を流れる電流は同じです。回路が途中で分岐したときは、流れる電気は変わりますが、合計は同じです。

 いかがでしたか?「電圧」と「電流」について少しでもイメージできていたら幸いです。ここまで長々と書き連ねてきましたが、「電圧が力」で「電流が量」みたいな感覚が持てていれば、入門にはひとまずそれで十分です。最初にも書きましたが、今回はなんとなくイメージを掴んでもらうのが目的です。実際に電気が流れるとき物理現象として何が起きているのかについては、またいずれ紹介したいと考えています。最後に今回のポイントをまとめて終わります。

・電気は電位の高いところから低いところに流れる
・電位の高いところでは電圧がかかっている
・流れる電気の量が電流

乾電池のはなし(後半)

 こちらの記事は乾電池のはなし後半になります。
まず、サイズや電圧ではなく成分の違いによる分類を紹介しておきましょう。

 

 電池を買うとき、アルカリ乾電池やマンガン乾電池という言葉が書いてあります。これが成分の違いを表しています。具体的に使われている化学薬品や発電の仕組みまで理解する必要はないので、乾電池にはこの2つがあるとだけ覚えていてください。大雑把に言ってしまうと、マンガン乾電池を進化させたのがアルカリ乾電池です。普段の生活で使うものには、特に指定がない限りアルカリ乾電池を使っておけばまず問題はありません。
 ですが、電気の実験をするときはマンガン乾電池を使うことをお勧めします。その理由は、うっかり危険な回路を作ってしまったとき、マンガン乾電池の方が大きな事故になりにくいからです。アルカリ乾電池は基本的にマンガン乾電池より反応が速くパワーもあるため、危険な回路を作ってしまった場合、発熱し破裂したりします。また、この破裂で中の化学薬品が肌につくとやけど、目に入れば最悪の場合失明の恐れがあります。マンガン乾電池なら危険な回路を作ってもいいというわけではありませんが、回路を作って遊ぶときはマンガン乾電池を使用しましょう。豆知識として紹介しておくと、マンガン乾電池は外装の色で性能が違います。緑、青、赤、黒があります。興味があればそれぞれの性能について調べてみましょう。

 

 最後に、使い終わった乾電池の捨て方について紹介しておきます。この記事の前半で乾電池は使い捨ての消耗品と書きましたが、普通の燃えるごみと一緒に袋に入れて捨ててはいけません。ではいつどこで捨てられるのか。それはお住まいの市町村により異なります。ですが、捨てる乾電池を保管する場合、共通して少し注意が必要です。使えなくなった電池は必ずしも使い切った電池ではありません。つまり、多少発電能力が残っている場合があります。このような電池がショート回路を作ってしまった場合危険です。そんな回路わざわざ作らないよ。と思ったあなた。捨てる電池をビニール袋にため込んだりはしていませんか。乾電池の外装は電気を通す金属でできているため、ごちゃごちゃと詰め込んでいたら偶然回路ができて事故につながる可能性もあります。使えなくなった電池の保管には絶縁処理が必要です。難しいことはありません。両側にセロハンテープを貼るだけで大丈夫です。

 

 ここまで簡単に乾電池について紹介してみました。知っていることも多かったかもしれません。後半では少し脅かすような内容も書きました。電圧とか回路とか、聞きなれない単語についてはまた次回以降に紹介していきたいと思います。最後に今回のポイントをまとめて終わります。

 

乾電池のまとめ
・乾電池は消耗品
・基本的に1.5[v]
・実験ではマンガンを使う
・捨てる電池にはテープを貼って保管