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

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

びぎなーがうにてぃがくしゅうをつうじてかんじたもの

れっつびぎん その3

何で僕はつらいことあるとすぐポエム書いてしまうん……。僕の中でここ最近ポエム書きすぎ問題が発生しているんだけど、まあ精神病むとポエムが捗るよなwww。

前回記事
inujini.hatenablog.com
ということで、ポエム投稿を兼ねたお勉強記事の続きをやっていきます。


やってみたわけです(おまけ)

前回よろしく今回もポエムの前にコースを消化していきます。ぶっちゃけメインのポエムよりも文章量が多いのはここだけの秘密。


13. Look At

対象をみる動作に関するLookAtQuaternionを併用することで比較的容易に複雑な見る動作を実装できるそうです。
参考
Transform-LookAt - Unity スクリプトリファレンス

using UnityEngine;
using System.Collections;

public class CameraLookAt : MonoBehaviour
{
    public Transform target;
    void Update ()
    {
        transform.LookAt(target);
    }
}


14. 線形補間

Unityにはある2点の値を線形(直線的)に補間してくれるLerpなんて関数があります。

void Update ()
{
    light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
}

例だと照明を良い感じにしてくれる設定に利用できるよ的なこと書いてあるね。

細かい挙動の違いはリファレンス載せておくのでそっちみて……。
参考
Unity スクリプトリファレンス
あと別にこれUnityだけの機能ではなく.NETの方にもあります。細かい違いは知らないです。物好きな方が検証してくれるんじゃない(丸投げ)?
.NET API ブラウザー | Microsoft Docs


15. Destroy

GameObjectとコンポーネントを削除方法。

using UnityEngine;
using System.Collections;

public class DestroyBasic : MonoBehaviour
{
    void Update ()
    {
         // スペースキーでゲームオブジェクトの削除
        if(Input.GetKey(KeyCode.Space))
        {
            Destroy(gameObject);
        }
    }
}

どんなものかについては百聞は一見に如かずということでこんなものです。
f:id:andron:20190923163214g:plain
もう環境すら用意するのが面倒になってライトを削除して確認するとかいう暴挙にでてます。


using UnityEngine;
using System.Collections;
public class DestroyOther : MonoBehaviour
{
    public GameObject other;
    void Update ()
    {
        if(Input.GetKey(KeyCode.Space))
        {
            Destroy(other);
        }
    }
}

ターゲットを指定してみる。

using UnityEngine;
using System.Collections;
public class DestroyComponent : MonoBehaviour
{
    void Update ()
    {
        if(Input.GetKey(KeyCode.Space))
        {
            Destroy(GetComponent<MeshRenderer>());
        }
    }
}

コンポーネントを削除してみる。


16. ボタンとキー入力

ボタンないしキーの入力についてです。GetKeyGetButtonあたりでなんとかなる。
f:id:andron:20190923173649g:plain

using UnityEngine;
using UnityEngine.UI;

public class KeyInput : MonoBehaviour
{
    public Text graphic;
    public Text standard;
    public Text downgfx;
    public Text upgfx;
    public Text heldgfx;

    void Start()
    {
        graphic.text = standard.ToString();
    }

    void Update()
    {
        // Key入力
        bool down = Input.GetKeyDown(KeyCode.Space);
        bool held = Input.GetKey(KeyCode.Space);
        bool up = Input.GetKeyUp(KeyCode.Space);
        // Button入力
        // bool down = Input.GetButtonDown("Jump");
        // bool held = Input.GetButton("Jump");
        // bool up = Input.GetButtonUp("Jump");
        if (down)
        {
            graphic.text = downgfx.ToString();
        }
        else if (held)
        {
            graphic.text = heldgfx.ToString();
        }
        else if (up)
        {
            graphic.text = upgfx.ToString();
        }
        else
        {
            graphic.text = standard.ToString();
        }

        GetComponent<Text>().text = " " + down + "\n " + held + "\n " + up;
    }
}

テキスト表示部分があれなのでコードを少し修正……。


17. GetAxis

キー入力関連操作の続き。矢印キーの入力を取得します。普通にキー入力の延長みたいなもんだとずっと思ってたんですけど、仮想軸の値を数値で取得するのでゲームパッドやなんかの絶妙な入力をカバーできるらしい。
f:id:andron:20190923175247g:plain

僕はゲームパッドとか持ってないからよくわかんないけどもなんとなくこれ貼って置きます。

あと入力心地のいいPC用コントローラの情報あったら教えていただけると助かる。検証機として購入するかは知りませんが……。

以下ソース

using UnityEngine;
using UnityEngine.UI;
public class AxisExample : MonoBehaviour
{
    public float range;
    public Text textOutput;
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float xPos = h * range;
        float yPos = v * range;

        transform.position = new Vector3(xPos, yPos, 0);
        textOutput.text = "Horizontal Value Returned: " + h.ToString("F2") + "\nVertical Value Returned: " + v.ToString("F2");
    }
}

参考
Input-GetAxis - Unity スクリプトリファレンス
Input-GetAxisRaw - Unity スクリプトリファレンス


18. OnMouseDown

入力関連の話が続きます。次はマウスの入力に関しての話。
f:id:andron:20190923201843g:plain

using UnityEngine;
public class MouseClick : MonoBehaviour
{
    void OnMouseDown()
    {
        GetComponent<Rigidbody>().AddForce(-transform.forward * 500f);
        GetComponent<Rigidbody>().useGravity = true;
    }
}

レッスンの内容として見る必要がある場所はOnMouseDown。他は別に……。


19. GetComponent

コンポーネントの取得方法

using UnityEngine;
public class UsingOtherComponents : MonoBehaviour
{
    public GameObject otherGameObject;
    private AnotherScript anotherScript;
    private YetAnotherScript yetAnotherScript;
    private BoxCollider boxCol;
    void Awake()
    {
        // GameObject
        anotherScript = GetComponent<AnotherScript>();
        // otherGameObject
        yetAnotherScript = otherGameObject.GetComponent<YetAnotherScript>();
        boxCol = otherGameObject.GetComponent<BoxCollider>();
    }
    void Start()
    {
        boxCol.size = new Vector3(3, 3, 3);
        Debug.Log("The player's score is " + anotherScript.playerScore); // 9001
        Debug.Log("The player has died " + yetAnotherScript.numberOfPlayerDeaths + " times"); // 3
    }
}

サンプルの方は確認用に別オブジェクトに貼り付けるようスクリプトとそのオブジェクトに追加するようにコード書くみたいですね。関係ないけどBoxColliderってなんでもおっけーだとか思ってたけどちゃんとCube使ってやらないと怒られるのね。

using UnityEngine;
using System.Collections;

public class AnotherScript : MonoBehaviour
{
    public int playerScore = 9001;
}
using UnityEngine;
using System.Collections;
public class YetAnotherScript : MonoBehaviour
{
    public int numberOfPlayerDeaths = 3;
}


20. DeltaTime

時間関係のDeltaTimeについて。関数だけのネタの場合、僕がリファレンス貼るだけの内容になってしまう……。
Time-deltaTime - Unity スクリプトリファレンス

f:id:andron:20190923205840g:plain
サンプルの方はこんな感じのやつ。

using UnityEngine;
using System.Collections;
public class UsingDeltaTime : MonoBehaviour
{
    public float speed = 8f;
    public float countdown = 3.0f;
    void Update()
    {
        countdown -= Time.deltaTime;
        //  Light ON
        if (countdown <= 0.0f)
            GetComponent<Light>().enabled = true;
        // 右入力で移動
        if (Input.GetKey(KeyCode.RightArrow))
            transform.position += new Vector3(speed * Time.deltaTime, 0.0f, 0.0f);
    }
}


21. データ型

IntegerとかStringとかそういう話なのかなと思ったら、値型と参照型の話だったの巻。
・参照型の変数はデータ (オブジェクト) への参照を格納
・値型の変数はデータを直接格納
なんて言われています。

using UnityEngine;
using System.Collections;

public class DatatypeScript : MonoBehaviour 
{
    void Start () 
    {
        // 値型
        Vector3 pos = transform.position;
        pos = new Vector3(0, 2, 0);
        
        // 参照型
        Transform tran = transform;
        tran.position = new Vector3(0, 2, 0);
    }
}

サンプルのケースでの確認だとなんとも言えないけども、事故ってからこれについて僕も確認してるので本当に理解しているのかといわれると怪しい概念だったりする。あ、事故るってのは意図しない変数書き換えが発生したときかね……。やってしまったってなるよね…………。


とまあ今回はここまで、そんな確認をしました。今回はUnityのリファレンスぺたぺた貼りすぎた感ある。まあ分かればいいし……べつにいいか……。ちなみになんですけどUnity5以降はGetComponent()みたいな書き方が推奨されるっぽいので文章中のコピペスクリプトも所々修正してます。

ポエム

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

なんか僕はもうだめかもしれない(定例報告)。僕はどうしてもこんなのをやっても「プログラミング理解した」とかいう心境になる感覚に全然ならないんですよね……。僕の観測圏にいるインターネットの人達はすごい勢いで理解したとか云々(でんでん)言ってるんですけど、そういうのの理解は計算機科学の領域であってどのプログラミング言語を触ってなんか動くものが作れるようになったとかそういうのでないと思うのですよ……。仕事で使えるってなったらまた別の認識なのかもしれないんですけどもね……。けども、僕はそういうのを仕事で活用できる世界にいないわけです。品出しのスピードとか清掃の効率とかそういうのの方が役立つ世界にいるわけです。ただ下手の横好きの感覚でこんなブログを更新し続けているだけなのです。んで、そういうことをぐるぐると巡らして考えるとやっぱ僕のブログにあげてるものってゴミ以外のなにものでもないなって思うわけですよ。ゴミしか生み出せないから価値がない。そういう現実を突きつけられながらこんなブログ更新し続けてるとメンタルやられていくわけです……。


やっぱ僕はなにやってもダメだな…。