概要
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeMover : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
これのStart()とUpdate()以外の部分の雑な解説、それから前の記事の最後に出てきたif文のもう少し掘り下げた使い方を解説します。
if文はともかく、前者は正直初心者の内は分からなくても全然オッケーなのでは……?って思ってるので読み飛ばしてif文の方に行ってもいいと思います。
前記事はこっち
https://qiita.com/VRCjonmyon34/items/d44302d4c84af44323cf
using
using 『名前空間』;
といった書き方をします。これは『名前空間』という機能の集まりを使うから察してね!
ってコードに対して宣言しているようなものです。
一番わかりやすい例としては、前の記事でも使っていたVector3型
ですね。
Vector3は使用する際に、本来UnityEngine.Vector3
という書き方をする必要があります。
でもいちいち書くのが面倒なので、using UnityEngine;
を宣言しておいて、Vector3だけでプログラム側に察してもらおう、ということです。
class
classというのは、変数や関数をまとめることが出来るモノです。とってもエライやつです。いっぱい褒めてあげましょう。
修飾子 class 『クラス名』
という書き方をします。後ろについてる:MonoBehaviourはいったん無視してください。クラスが終わった後に書きますので。
Unityでは基本的にこのクラスの中にいろいろ書いていってプログラムを書き進めていきます。基本的というか、10割この中に書いていいです。
クラス名は、そのクラスに期待する機能の名前をつけれると嬉しいです。今回ならCubeを動かしたかったのでCubeMover
にしておきました。
クラス型の変数を宣言することも可能です。その際は普通に変数を宣言するのと同じように
『クラス名』 変数名;
で宣言できます。
また、クラスの中に別のクラス型の変数を宣言することもできます。その別のクラス型の変数の中にまたまた別のクラス型を……以下略です。
上記の通り、クラスはおおよそなんでもまとめておけます。であるからこそ、クラスの中に何を入れて、何を別のクラスに入れるかという設計がとてもむずかしく、とても重要になってきます。私もこれに関しては全然分かりません、無理。
……が、初心者の内は気にしなくていいと思います。そんなことよりゲームやらなにやらを作ってそれが動く方が重要です。
『動かない綺麗な読みやすいコード』より『動くクソ読みづらいゴミみたいなコード』の方がずーっと価値があります。
自分でコードを考える際には、まずこれを頭に入れておけばいいと思います。コードを綺麗にすることなんてそれが動いてから考えればいいです。
まあ私は本業プログラマを目指しているので、『動く綺麗で設計の良い読みやすいコード』を書く必要があるんですけどね、ハハハ。
しんどい。
MonoBehaviour
ここがおそらく一番意味不明なところです。他のところはコードを書いてるうちになんとなーく理解出来てきたりするんですけど、ここだけは意味不明のままになりがちです。
クラスを書く際に、
class 『クラス名』:『別のクラス名』
と書くと、『別のクラス名』を継承した『クラス名』というクラス
が出来上がります。
継承というのは、クラスの中身の変数や関数を受け継いで別のクラスを作ること、だと思っておけばいいです。
今回の場合だと『MonoBehaviour』というクラスを継承した『CubeMover』というクラス
が作られていることになりますね。
で、このMonoBehaviourには何が入ってるのかというと、スクリプトをオブジェクトにアタッチするために必要な機能が詰め込まれています。
Unityでは基本的にスクリプトはコンポーネントとしてオブジェクトにアタッチ(要するにオブジェクトのInspectorにスクリプトを表示させること)して使うことが多いです。
その際にMonoBehaviourを継承していないクラスではオブジェクトにアタッチ出来ません。なので基本的にはコレを継承することになります。
逆に言えばコンポーネントとして使わないなら継承する必要はありません。ですがコレの判断もクラス設計にかかってくるので気にしなくていいです。
先ほども書いた通り、まずは**動けばいいんだよ動けば!**の精神で行きましょう。
{}
コードブロックです。コードのそれぞれの区切りで、この中にコードを書きます。ちゃんと区切ると見やすいです。
そんなこと今まで読んできたからわかるよ!って言いたいかもしれませんが、少しだけ待ってください。
まずはとりあえず下の関数を見てください。
void Hoge()
{
float X = 1.2f;
{
float X = 3.4f;
}
X = Y; //ココ
}
この関数の中で、コメントが書かれている最後の時点での変数Xの値はどうなっているでしょうか?
……正解は、『Yなんて存在しないよ!』というエラーが出てどうしようもない
という結果になります。
要するに、{}の中で宣言した変数は、その{}の中でしか生存できないということです。
これだけ覚えておけば大丈夫です。
if文
ココがゲームを作るという観点から見れば一番大事です。
if(/*条件式*/)Hoge();
if(/*条件式*/)
Hoge();
if(/*条件式*/)
{
Hoge();
}
どれもif文になります。処理が2行以上続くなら一番下を使いましょう。
if(/*!条件式*/){処理A}
if(/*条件式A*/ && /*条件式B*/){処理B}
if(/*条件式C*/ || /*条件式D*/){処理C}
少し変わった条件式の書き方です。ここから本番。
C#では『!』は否定
の意味だと思ってもらえばいいです。
今回の場合だと(/!条件式/)なので、『条件式ではない』が真であれば(正しければ)、つまり1行目は、条件式が偽であれば(正しくなければ)処理Aが実行されるということです。
&&はかつ
の意味です。
条件式Aが真かつ条件式Bが真であるなら、つまり2行目は条件式AとBのどちらも真なら処理Bが実行されるということです。
||はまたは
の意味です。
条件式Cが真または条件式Dが真であるなら、つまり3行目は条件式CかDのどちらかあるいは両方が真なら処理Cが実行されるということです。
この辺はしばしば使うので認識しておくと吉です。
if(/*条件式 A*/)
{
//処理A
}
else if(/*条件式 B*/)
{
//処理B
}
else
{
//処理C
}
条件の分岐するif文の書き方です。
このコードの場合、条件式Aが真
であれば**処理Aが実行されます。**その後の処理B,Cは実行されません。
条件式Aが偽で、条件式Bが真
であれば、処理Aは実行されず、処理Bが実行されます。その後の処理Cは実行されません。
条件式A,Bともに偽
であれば、処理A,Bは実行されずに処理Cのみが実行されます。
注意点としては、条件式Aと条件式Bの両方が真であった場合に上記の書き方をしてしまうと、処理Aを通ってしまって処理Bを通らないので、並べる順番等々を気を付けなければならないところですかね。
まとめ
長々書きましたけど、実際に書いてみたりコードに直面しない限り多分よくわかんないと思います。私はこれを書いていて混乱してきました。
なのでこれ別に覚えなくてもいいです。そのうち勝手に覚えてると思うので。