コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

びぎなーがほうこくするうにてぃがくしゅう

れっつびぎん その2

とても私的なことなんですが前回記事の内容を通じてポエムが書きたくなったので前回記事を利用してポエムを書きます。

前回記事
inujini.hatenablog.com

ポエム書くのにここのやつを使いたくなったので使っていきます。このコース27項目もあってクソ長いのでやるのは一部だけです*1


やってみた おまけコンテンツ

ということでまずはコースの方を消化していきます。いきなりおまけコンテンツとかつけてしまいました。そう、メインパートは僕のくっそどうでもいいポエムなんですね。興味がなければこの段階でブラウザバックしよう!というわけで、やっていきます。前回変数と関数は終えたものとして続きをやっていきます。

3. 規則と構文
C#という言語は「BSD/オールマンのスタイル」を採用しています。

御文の後の中括弧を次の行に置き、制御文と同じ字下げ位置とする。ブロック内の文は次のレベルに字下げされる。

こんなやつ。実際の構文は下の例文見て感じ取って……。

using UnityEngine;
using System.Collections;
public class BasicSyntax : MonoBehaviour
{
    void Start ()
    {
        Debug.Log(transform.position.x);       
        if(transform.position.y <= 5f)
        {
            Debug.Log ("I'm about to hit the ground!");
        }
    }
}

まあ、僕この文法ガン無視して書きますけどね。文末セミコロンのミスが分かりやすくなり可読性が増すとかなんとか言われてるんですけど、IDEの赤枠部分ぱかぱかして確認すればなんとかいけるんじゃないのとか思ってるんでルールを守ってないですw。
f:id:andron:20190921225413p:plain


4. IF文

条件分岐を行うことのできるIf文についてです。僕からは特に言うことがない。{}を省略すると次の;までとなる。省略したら可読性が犠牲になっている気がするんですが僕はそういうの知らない。

using UnityEngine;
using System.Collections;
public class IfStatements : MonoBehaviour
{
    float coffeeTemperature = 85.0f;
    float hotLimitTemperature = 70.0f;
    float coldLimitTemperature = 40.0f;
    
    void Update ()
    {
        if(Input.GetKeyDown(KeyCode.Space))
            TemperatureTest();
        
        coffeeTemperature -= Time.deltaTime * 5f;
    }
       
    void TemperatureTest ()
    {
        if(coffeeTemperature > hotLimitTemperature)
        {
            print("Coffee is too hot.");
        }
        else if(coffeeTemperature < coldLimitTemperature)
        {
            print("Coffee is too cold.");
        }
        else
        {
            print("Coffee is just right.");
        }
    }
}

If文です。サンプルプログラムがUpdateの方で条件を時間ごとにずらす様にしているからTemperatureTestの結果が時間ごとに異なるようになってる。


5. 繰り返し

いわゆるループ。サンプルではforとwhile、dowhile、foreachでのループを見ていきます。

using UnityEngine;
using System.Collections;

public class ForLoop : MonoBehaviour
{
    int numEnemies = 3;     
    void Start ()
    {
        for(int i = 0; i < numEnemies; i++)
        {
            Debug.Log("Creating enemy number: " + i);
        }
    }
}
using UnityEngine;
using System.Collections;

public class WhileLoop : MonoBehaviour
{
    int cupsInTheSink = 4;  
    void Start ()
    {
        while(cupsInTheSink > 0)
        {
            Debug.Log ("I've washed a cup!");
            cupsInTheSink--;
        }
    }
}
using UnityEngine;
using System.Collections;

public class DoWhileLoop : MonoBehaviour 
{
    void Start()
    {
        bool shouldContinue = false;        
        do
        {
            print ("Hello World");            
        }while(shouldContinue == true);
    }
}
using UnityEngine;
using System.Collections;

public class ForeachLoop : MonoBehaviour 
{   
    void Start () 
    {
        string[] strings = new string[3];
        strings[0] = "First string";
        strings[1] = "Second string";
        strings[2] = "Third string";        
        foreach(string item in strings)
        {
            print (item);
        }
    }
}

僕的には無限ループ作りたいときはwhile、配列やなんかはforeach、同じ処理の繰り返し呼びたいなーってときはforみたいな感じで使ってる。それが正しいのかどうかは知らない。


6. スコープとアクセス修飾子

ここではpublicprivateに関しての話。スコープを小さくするとあらぬ動作をする変数の影響を防ぐことができます。僕はJavaみたいにクソ長変数名つけてたらちょっとやそっとじゃ変数被りとか起こさないと思ってしまうのですよね。だから、命名部分の方に力を入れてあとざっくりでもいいんじゃね?とか思ってるんですけどどうなんでしょう。

using UnityEngine;
using System.Collections;

public class ScopeAndAccessModifiers : MonoBehaviour
{
    public int alpha = 5;        
    private int beta = 0;
    private int gamma = 5;        
    private AnotherClass myOtherClass;
    void Start ()
    {
        alpha = 29;        
        myOtherClass = new AnotherClass();
        myOtherClass.FruitMachine(alpha, myOtherClass.apples);
    }        
    void Example (int pens, int crayons)
    {
        int answer;
        answer = pens * crayons * alpha;
        Debug.Log(answer);
    }        
    void Update ()
    {
        Debug.Log("Alpha is set to: " + alpha);
    }
}
public class AnotherClass
{
    public int apples;
    public int bananas;
    private int stapler;
    private int sellotape;    
    public void FruitMachine (int a, int b)
    {
        int answer;
        answer = a + b;
        Debug.Log("Fruit total: " + answer);
    }        
    private void OfficeSort (int a, int b)
    {
        int answer;
        answer = a + b;
        Debug.Log("Office Supplies total: " + answer);
    }
}


7. AwakeとStart

この辺りからUnity固有の要素が出てきている気がする……。似たような挙動してますがAwakeは何よりも先に呼び出されるって感じらしいですよ。詳細は参考リンクのスクリプトライフサイクルフローチャートみるとわかりやすいです。
参考リンク。
イベント関数の実行順 - Unity マニュアル

using UnityEngine;
using System.Collections;
public class AwakeAndStart : MonoBehaviour
{
    void Awake ()
    {
        Debug.Log("Awake called.");
    }
    void Start ()
    {
        Debug.Log("Start called.");
    }
}


8. UpdateとFixedUpdate

なんか昔もどこかでこれについてまとめた記憶がある。

説明
Update MonoBehaviour が有効の場合に、毎フレーム呼び出されます
FixedUpdate MonoBehaviour が有効の場合、この関数は毎回、固定フレームレートで呼び出されます。

以上です。細かな挙動の違いはやりながら感じていく感じで良いと思ってる。

using UnityEngine;
using System.Collections;

public class UpdateAndFixedUpdate : MonoBehaviour
{
    void FixedUpdate ()
    {
        Debug.Log("FixedUpdate time :" + Time.deltaTime);
    }    
    void Update ()
    {
        Debug.Log("Update time :" + Time.deltaTime);
    }
}


9. ベクトル
内積外積についての簡単なまとめ。まあ詳しいことは公式みよう!
参考リンク
Vector3-Dot - Unity スクリプトリファレンス
Vector3-Cross - Unity スクリプトリファレンス
個人的には計算式よりもその計算結果で何ができるのかとか知っておくと色々応用利くって印象ある。

ソースとかないので動画を一応貼っておく。


10. コンポーネントのEnablingとDisabling

myLight.enabled = !myLight.enabled;の部分がオンオフスイッチになってるんだけど良い感じにライト付けたり消したりするオブジェクトを作れなかったらコード(面倒くさかった)をそのまま載せます。

using UnityEngine;
using System.Collections;

public class EnableComponents : MonoBehaviour
{
    private Light myLight;    
    void Start ()
    {
        myLight = GetComponent<Light>();
    }
    
    void Update ()
    {
        if(Input.GetKeyUp(KeyCode.Space))
        {
            myLight.enabled = !myLight.enabled;
        }
    }
}


11. ゲームオブジェクトのアクティベーション

オブジェクトのアクティブな状態について。サンプルコードはどうやってアクティブにするかとかそんな感じ。

using UnityEngine;
using System.Collections;

public class ActiveObjects : MonoBehaviour
{
    void Start ()
    {
        gameObject.SetActive(false);
    }
}
using UnityEngine;
using System.Collections;

public class CheckState : MonoBehaviour
{
    public GameObject myObject; 
    void Start ()
    {
        Debug.Log("Active Self: " + myObject.activeSelf);
        Debug.Log("Active in Hierarchy" + myObject.activeInHierarchy);
    }
}

参考の解説を見ていただければ特に何も言うことはない。
参考
Unity - スクリプティング API: GameObject.SetActive
Unity - スクリプティング API: GameObject.activeSelf
Unity - スクリプティング API: GameObject.activeInHierarchy



12. Translate と Rotate

オブジェクトの位置と回転の操作について。だんだん公式リファレンス貼って投げやりになっているけどもこれもこの部分見ておけばいいと思う。
UnityEngine.Transform - Unity スクリプトリファレンス

using UnityEngine;
using System.Collections;
public class TransformFunctions : MonoBehaviour
{
    public float moveSpeed = 10f;
    public float turnSpeed = 50f;   
    void Update ()
    {
        if(Input.GetKey(KeyCode.UpArrow))
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        
        if(Input.GetKey(KeyCode.DownArrow))
            transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
        
        if(Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime);
        
        if(Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
    }
}

このサンプルとかだと動きがあるから別にスクショ撮っても良かったかもしれない…。


とまあそんな確認です。まあ今更ながら基本事項の確認となります。こういうのやって勉強にならなかったとは僕は言わないです。基本的な操作方法だけどもリファレンスに書いてある内容を網羅するなんてとてもじゃないけどできないですので……


ポエム

さてさて、というわけでここからがポエムです。

僕思うのですよね…。プログラミングとかそういうジャンルだとよくアウトプットのための学習記録をつけようとかあるんですけど、やっぱりそういうのって自己満足のマスターベーションでしかないんじゃないかなって……。書いて動くもの作って勉強した気になって気持ち良くなっているだけに過ぎないんですよね……。かく言う僕は「これを終えれば自分の中で何か変えられる」とか意味不明な理論を掲げて続けていますが分かってるんですよね……。無駄なあがきだってこと。世間がこういう『学習記録をつけるのはいいぞ!』なんて後押ししているせいで勝手に自分が勘違いしていること。そして、その言葉は決して自分に向けられた言葉ではないってことを……。


ホント、バカだなあ。僕は……。

*1:あんまり長々と書きたくない……それがメインではないので……。