Unityでゲーム、アプリ開発

Unityで初めてゲームやアプリを作る人のための支援ブログです。

Unity ランゲームを作ろう②地面を自動生成して無限に走る 3Dゲーム作り⑥

今回はランゲーム作りにおいて、一つずつ地面を作っていると
時間とゲーム自体重くなってしまうので自動で地面を作成する方法です。

※動画での説明がいい方は下記動画をご覧ください。
記事での説明がいい方はそのまま読み進めてください。

youtu.be



ランゲームを作ろう②地面を自動生成して無限に走ってみよう!

f:id:Phoenix9056:20200421220004p:plain

今回は地面の自動生成と言うことですが、
一応前回の続きからになっています。
動画での説明をするために一から作ったので前回とキャラが変わっていますがあしからず。
※気になる方は下記リンクをご参考にしてください。
www.unityprogram.info

地面はキューブでも構わないのですが、
アセットをサイトから無料で手に入れて色のついた地面を
使っていきます。
※下記リンクより、NejikoRunを右上にある黄緑の
ダウンロードからダウンロードしてください。

unitylist.com

次の回でもこのアセットを使っていこうと思います。
ダウンロードが完了したらProject内にドラッグ&ドロップして
インポートしましょう!


f:id:Phoenix9056:20200421220906p:plain

まずProject内にある先程インポートしたアセット、
①のNejikoRun-masterの▶︎をクリックして、②のPrefabsを選択します。

③のDefaultStageScene画面に2個ドラッグ&ドロップして、
Hierarchyにある④の様に名前をDefaultStage0,DefaultStage1
名前をつけてください。

f:id:Phoenix9056:20200421224757p:plain
DefaultStage0Inspector内にあるTransform
Psitionxは0、Yは0、Zは−30に変更して、
DefaultStage1全て0にしてください。
そうするとステージが繋がるかと思います。

次に後から作成するスクリプトを入れておくオブジェクトを作ります。
Hierarchyの⑤のクリック⇨Create Emptyを選択して、
空のGameObjectを作成します。
名前を⑥の様にStageにしましょう。


f:id:Phoenix9056:20200421225447p:plain

次にステージを生成するスクリプトを作成します。
Project内の自分が分かりやすい所で、右クリック⇨Create⇨C# Scriptを選択して
名前をStageにします。

次のコードをコピー&ペーストするか、同じ記述にしてください。

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

public class Stage : MonoBehaviour
{
    //int型を変数StageTipSizeで宣言します。
    const int StageTipSize = 30;
    //int型を変数currentTipIndexで宣言します。
    int currentTipIndex;
    //ターゲットキャラクターの指定が出来る様にするよ
    public Transform character;
    //ステージチップの配列
    public GameObject[] stageTips;
    //自動生成する時に使う変数startTipIndex
    public int startTipIndex;
    //ステージ生成の先読み個数
    public int preInstantiate;
    //作ったステージチップの保持リスト
    public List<GameObject> generatedStageList = new List<GameObject>();

    void Start()
    {
        //初期化処理
        currentTipIndex = startTipIndex - 1;
        UpdateStage(preInstantiate);
    }

    
    void Update()
    {
        //キャラクターの位置から現在のステージチップのインデックスを計算します
        int charaPositionIndex = (int)(character.position.z / StageTipSize);
        //次のステージチップに入ったらステージの更新処理を行います。
        if (charaPositionIndex + preInstantiate > currentTipIndex)
        {
            UpdateStage(charaPositionIndex + preInstantiate);
        }
        
    }
    //指定のインデックスまでのステージチップを生成して、管理下におく
    void UpdateStage (int toTipIndex)
    {
        if (toTipIndex <= currentTipIndex) return;
        //指定のステージチップまで生成するよ
        for (int i = currentTipIndex + 1; i <= toTipIndex; i++)
        {
            GameObject stageObject = GenerateStage(i);
            //生成したステージチップを管理リストに追加して、
            generatedStageList.Add(stageObject);
        }
        //ステージ保持上限になるまで古いステージを削除します。
        while (generatedStageList.Count > preInstantiate + 2) DestroyOldestStage();

        currentTipIndex = toTipIndex;
    }
    //指定のインデックス位置にstageオブジェクトをランダムに生成
    GameObject GenerateStage (int tipIndex)
    {
        int nextStageTip = Random.Range(0, stageTips.Length);

        GameObject stageObject = (GameObject)Instantiate(
            stageTips[nextStageTip],
            new Vector3(0, 0, tipIndex * StageTipSize),
            Quaternion.identity);
        return stageObject;
    }
    //一番古いステージを削除します
   void DestroyOldestStage ()
    {
        GameObject oldStage = generatedStageList[0];
        generatedStageList.RemoveAt(0);
        Destroy(oldStage);
    }

}

出来上がった①のStageスクリプトを、
Hierarchy内にある②のStageオブジェクトにドラッグ&ドロップしてアタッチしてください。
そうすると③の様に追加されます。


f:id:Phoenix9056:20200422003529p:plain

今度はスクリプトの設定をしていきます。
①のキャラクターをCharacterの部分にドラッグ&ドロップしてください。

次に、Stage TipsSizeと入力して、Element0の所に
Project内⇨NejikoRun-master⇨Prefabs⇨DefaultStage
ドラッグ&ドロップします。

Start Tip Indexの値をにして、Pre Instantiateを5と入力します。
Generated Stage ListSizeと入力して、③のDefaultStage0,1を順番に
ドラッグ&ドロップしてください。

ここでもう一手間加えてみましょう!


f:id:Phoenix9056:20200422004521p:plain

ステージの先の方が途切れて無くなっている様に見えるので
色をつけてぼかしを入れてごまかしていきます。

エディタ画面上部にある、①のWindowをクリック。
次に②のRendering⇨③のLighting Settingsを選択。
そうするとLighting設定画面が開きます。

下にスクロールしていくと、Other Settingの項目の中の
④のFogのチェックを入れてください。
⑤のColorを自分が好きな色に変更してください。

最後に⑥Densityの値を0.03と入力してください。
そうすると⑦の様にステージの先に色がついたぼかしが出来てまだ
その先にステージがあるかの様に表現することが出来ます。

それでは再生して地面がずっと続いていくか試してみましょう!

f:id:Phoenix9056:20200422015200g:plain

無限に走ることが出来たでしょうか??
みなさんも夢に向かって走り続けて頑張りましょう!笑笑

今度は敵キャラクターの配置なんか
やっていきたいと思います。

ご視聴ありがとうございました。


※本格的に3Dゲームを作っていきたい方は下記記事をご覧ください。
www.unityprogram.info

※オススメのアセットは下記カテゴリより。便利な無料アセットがあります。
www.unityprogram.info

※Unityを学習していきたい方は下記カテゴリを覗いてみてください。
www.unityprogram.info

※オススメの実際に使ってみた学習本は下記カテゴリを参考にしてください。
www.unityprogram.info

※初心者に向けた簡単な記事や基本的な記事は下記カテゴリを参考にしてください。
www.unityprogram.info