見出し画像

Unity再開02・これまでの振り返りと、前回の宿題の答え

昨日から再開することにした、Unityの勉強。

今日は昨日説明しきれてなかったり、思い出し切れてなかったりした点の、復習をしたいと思います。

前回の記事はこちら。

まず、私のPCの、Unity用のプロジェクトフォルダをキャプチャーした下記の画像。このうちのCodeGen_というのがついているのは、相互フォローさせていただいているENDO SHINJIさんから教えていただいた、CodeGeniusというサイトの、サンプルプログラムを勉強していた名残り。更新日時が2023/04/07、2023/04/08となっています。この更新日時は、Unityで読み込むと更新されるようなので、4/7から4/8前後に作ったか参照したということになりますね。

正確には上記のフォルダそれぞれの直下の、「Packages」というフォルダの更新日時が、そのプロジェクトに変更をかけた最終日付になっているようです。この日付をプロジェクトフォルダのフォルダ名に付与しておけば、日付順にソートすることも出来るので、頻繁にバックアップを取っている、私のようなやり方の人には、便利かも知れませんね。

やってみました(笑。
Packegesの更新日付を、その上位のプロジェクトフォルダの名前の先頭に付与し、ファイル名でソート。

順番に並んでいると、色々思い出せます。

noteの記事にするために「島」を作り始め、そこにモンスターの巣を設置したのが3/30。

爆発を追加したけれど、うまく木が揺らせないので、「島」の作り方が悪いのかと考え試行錯誤を始め、ウインドゾーンという機能に対応した木のモデルじゃないとダメということがわかってやってみたのが3/31。

4/1には、時限爆弾のアセットを自作しようとしたのですが飽きて放置。「島」に爆風を追加しようとした所、おかしな動作をし始め、あることに気づいてその状況を保存しようとしたのがnote_14、その後視点(カメラ)を変更し、ウィンドゾーンを追加し、音声も追加し...…、という所で思ったように動かせず、泣きを入れた所ENDO SHINJIさんからCodeGeniusのサイトを教えていただき2日かけてお勉強。

4/8には、会得した知識で「島」にシューティングゲームの要素を追加し、落下してくるモンスター(カラフルな立方体)を、銃で狙撃すると爆発して木を揺らす、という所まで実現しアニメGIFにしてnoteで公開。そこで「そもそも私のやりたかったのは何だろう」と考え、3Dのダンジョンを生成するというサンプルを作成。

今ここ、ですね↓

上記の「Unityやってみる」という記事、確認すると21,23,24しか残ってないですね。私の記事では、ただ単にチュートリアル的なものだけを掲載するのではなく、割と経験のあるプログラマーとしての視点から、Unityの仕様を考察するみたいなものも、含まれていたので、「何書いてたっけなあ、消しちゃったのはもったいなかったなあ」、とものすごく後悔しています(笑。

まあ消してしまったものはしょうがない。今後は「絶対に消さない」という信念の元に、記事をアップしていきたいと思います。

あと前回の宿題です。下記のコード中の、「Quaternion.identity」とは一体......、という疑問についてです。

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

public class Explosion : MonoBehaviour
{
    public GameObject explosionPrefab;

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Terrain")
        {
            GameObject exp_obj = Instantiate(explosionPrefab, transform.position, Quaternion.identity);
            var main = exp_obj.GetComponent<ParticleSystem>().main;
            main.stopAction = ParticleSystemStopAction.Destroy;
            Destroy(this.gameObject);
        }
    }
}

Unityの、スクリプトリファレンスのページで、「Quaternion」で検索したらあっさり解決。「爆発用プレハブ(explosionPrefab)を実体化(Instantiate)する際に、その座標をtranform.position、回転方向をQuaternion.identifyにしてくださいね」、ということになりますね。この座標と回転方向は、何の座標と回転方向かというと、それが省略されているため、このスクリプトの呼び出し元、つまりモンスター(カラフルな立方体)になります。つまりモンスターの位置に、モンスターと同じ向きで爆発エフェクトを発生させよ、ということですね。


次に、「var main = exp_obj.GetComponent<ParticleSystem>().main」って、何をやってるの? っていう疑問についてです。

上記を日本語にわかりやすく(?)翻訳すると、「exp_objっていう変数を、ParticleSystemっていうクラスとして扱って、そのクラスのmainっていうコンポーネントを取り出して、新たに作ったmainという別の変数に格納してね」ってことになりますね。

もっとわかりやすく意訳すると、「爆発エフェクトをコントロールするための、制御コンピューターにアクセスしてね」っていうことですね(?)。

で、その下の「main.stopAction = ParticleSystemStopAction.Destroy;」は、「爆発エフェクトが終了した時には、その爆発エフェクト自体を自己破壊(Destroy)させるように、制御コンピューターに命令してね」ってことです(?)。

さらに言うとその下の「Destroy(this.gameObject);」は、「このスクリプトを実行しているオブジェクト自体を破壊せよ」という本部からの命令です(?)。

以上によって、①カラフルな立方体が地面に接地することで、このスクリプトがコールされ、②爆発エフェクトのプレハブが実体化され、③その爆発エフェクトが終了した際に爆発エフェクトが消滅するよう設定され、④最後にその爆発エフェクトだけを残し、カラフルな立方体は自己破壊される、という処理になりますね。

と、いうことで前回の宿題も終了です。次回は下記の、「スクリプトひとつで迷宮を生成」の復習と、その続きを検討していきます。

この記事が気に入ったらサポートをしてみませんか?