Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

IMGUIのボタンを押すとゲームオブジェクトが降ってくる挙動をつくる

shuzo-kino.hateblo.jp
で使ったIMGUIのお手軽ボタンのアクションとして、
Level1をクリックしたらキューブが、Level2をクリックしたらキャラクターが降ってくる挙動をつくります。

実際のところ

作業の前提

以前の作業で作ったCubeやCapsle(赤米)と、そのイベントやら周りがある前提。
shuzo-kino.hateblo.jp

新しいロボットをAsetts Storeからよみこみ

ロボットは超有名ドコロのSpaceRobotKyle君をアセットストアから導入し、作業中シーンに読み込んでおきます。
assetstore.unity.com

スクリプト

オブジェクトの生成はInstantiate関数でいけました。

古めな情報だと前後に色々ついてた時代もあったみたいですが、
すくなくとも今回の用途ではこの記法で必要なオブジェクトを生成可能。

引数は順番に、

  • 対象オブジェクト
  • 生成座標(3DならVector3)
  • 回転情報 特に必要ないならQuaternion.identity = 回転なし
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Button : MonoBehaviour
{
    public GameObject boxobject;
    public GameObject robotobject;

    void OnGUI ()
    {
        GUI.Box(new Rect(10,10,100,90), "Loader Menu");
    
        if(GUI.Button(new Rect(20,40,80,20), "Level 1"))
        {
            Instantiate(boxobject, new Vector3 (0.2f, 0.2f, 0.2f), Quaternion.identity);
        }
    
        if(GUI.Button(new Rect(20,70,80,20), "Level 2")) 
        {
            Instantiate(robotobject, new Vector3 (0.3f, 0.3f, 0.3f), Quaternion.identity);
            print("here 2");
        }
    }
}

オブジェクトの紐づけ

Button.csはこれまでの作業でButtonTriggerというGameObjectに紐づけてあります。
スクリプトを更新したことで、Inspectorにも項目が増えてますから、画面でオブジェクトを紐づけていきます。
Hierarchyにあるもの以外でも、読み込んでいればAssetsから読みだし可能です。*1

やってみる

デフォでは、こんな感じ。
f:id:shuzo_kino:20210513013434p:plain
さっそくLevel1を押下してKyle君を呼び出します。
スクリプトを割り付けてないので、棒立ちですけどね。
f:id:shuzo_kino:20210513013327p:plain
更にLevel2を押下しCubeを表示!
f:id:shuzo_kino:20210513013400p:plain

生成ゲームオブジェクトにスクリプト他がついてるなら、それもついてくる

さて、ここで問題が。
このCubeにはこれまでの実装でIs Triggerとして機能させており、スクリプトも割付られています。
というわけで、どっちに触れてもイベントが発火し、赤米が回転します。
離れれば赤米も、新造Cubeも消えます。
今の実装だと元あったCubeは破壊対象じゃないので……赤米を破壊した後、元あったCubeに触れるとエラーでクラッシュします。
普通のゲーム作りなら問題ですが、今は挙動をつかむのが目的なのでそのまんまにしときます。

*1:私はここで、ロボットをHierarchyに入れてから不可視化方法で四苦八苦しました。考えてみれば、それでは使い辛くて仕方ないでしょうに。