Unityでピクミンっぽいゲームを作る(隊列の作成、オブジェクトの運搬)

Unity

完了までにかかる時間:約15分

はじめに

今回はUnityでピクミンのようなゲームを作りたいと思います。具体的には、ピクミンモドキをプレイヤーに追従させるようにしたり、モノを運ばせたりします。

以下が完成のイメージです。

地面を作成

上の動画ではテレインを使用していますが、キューブやプレーンでもかまいません。大きさも動画ほど広くなくてもOKです。

地面のオブジェクトは必ずstaticにしてください。ここを忘れるとピクミンは動きません。

プレイヤーの作成

適当にカプセルオブジェクトを作成します。名前をPlayerに命名します。

メインカメラをその子オブジェクトにします。

また、プレイヤーの子オブジェクトとしてからのオブジェクトを作成し、GathPosと名付けます。

GathPosはプレイヤーの後ろに設置してください。ピクミンたちはここをめがけてプレイヤーを追いかけます。

そしてプレイヤーにRigidbodyを追加します。Use Gravityをfalseにします。重力は独自に作ります。

コード

新たにControllerというC#スクリプトを作成し、Playerに貼り付けます。そして以下のコードをコピペします。

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

public class Controller : MonoBehaviour
{
    [SerializeField] float speed;
    [SerializeField] float rotSpeed;
    [SerializeField] float gravSpeed;

    public List<Pikmin> followingPikmins;
    [SerializeField] GameObject PikminPrefab;
    [SerializeField] Transform playerGathPos;

    [SerializeField] Transform onionPos;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.X))
        {
            Pikmin pik = Instantiate(PikminPrefab, onionPos.position, Quaternion.identity).GetComponent<Pikmin>();
            pik.follow = true;
            pik.PlayerGathPos = playerGathPos;
            pik.homePos = onionPos;
            pik.controller = this;
            followingPikmins.Add(pik);

        }

        float x = Input.GetAxis("Horizontal") * speed;
        float y = Input.GetAxis("Vertical") * speed;

        rigid.velocity = (transform.forward * y + Vector3.down * gravSpeed);
        transform.Rotate(new Vector3(0, x, 0) * rotSpeed * Time.deltaTime);
    }


    [SerializeField] Rigidbody rigid;
    [SerializeField] Camera camera;
    private void LateUpdate()
    {
        camera.transform.LookAt(transform.position);
    }
}

そして、このコンポーネントを以下の画像のようにセットします。

PikminPrefabとOnionPrefabはまだ代入しなくてOKです。

PlayerGathPosは先ほど作成したGathPosを代入、RigidにはプレイヤーのRigidbody、Cameraにはプレイヤーの子オブジェクトにあるカメラを代入してください。

基地の作成

ピクミンがモノをどこに運ぶか決める必要があります。

空のゲームオブジェクトを作成し、その子オブジェクトを使って以下のような基地を作成しました。(基地の外形は何でもOKです)

かなりテキトウではありますが(‘◇’)ゞ

これを「Onion」と名付けます。

注意することとして、できるだけオニオン親オブジェクトは地面すれすれに設置した方が良いです。

完成したら、Controllerスクリプトの onionPosに作ったオニオンを入れます。

ピクミンの作成

適当にカプセルオブジェクトを作成して、NavMesh Agentコンポーネントを貼り付けます。

そして、新たにPikminという名のC#スクリプトを作成し、作ったオブジェクトに貼り付けます。以下をコピペしてください。

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

public class Pikmin : MonoBehaviour
{
    [SerializeField] NavMeshAgent agent;
    [SerializeField] bool follow;

    public Controller controller;
    public Transform PlayerGathPos;
    public Transform homePos;

    public ObjectController targetObject;
    public bool goHome;



    private void Update()
    {
        if (follow)
        {
            agent.SetDestination(PlayerGathPos.position);
        }

        if (goHome)
        {
            agent.SetDestination(homePos.transform.position);
            if(Vector3.Distance(transform.position, homePos.transform.position) <= 0.85f)
            {
                controller.followingPikmins.Add(this);
                follow = true;
                goHome = false;
                Destroy(targetObject.gameObject);
            }
            return;
        }

        if(targetObject != null)
        {
            agent.SetDestination(targetObject.transform.position);
            if (Vector3.Distance(transform.position, targetObject.transform.position) <= 0.75f)
            {
                targetObject.transform.position = transform.position + Vector3.forward * 0.9f;
                targetObject.transform.SetParent(transform);
                Destroy(targetObject.GetComponent<Rigidbody>());
                goHome = true;
            }
        }
    }
}

agentには先ほど追加したNavMesh Agentを代入します。

また、ピクミンのNavMeshの数値を少し変えます。

Speedを6、Angular Speedを360にセットします。しかし、これらの数値はステージの環境などによるので微調整は個人個人でお願いします。

作成が完了したらプレハブ化し、ControllerコンポーネントのPikminPrefabにプレハブを代入します。

プレハブ元のゲームオブジェクトは削除してください。

運ぶモノの作成

オブジェクトの作成

テキトウなキューブ型オブジェクトを作成します。Rigidbodyを追加します。

また、Event Triggerを追加してPointer Clickを追加します。

新たにC#スクリプトを作成し、ObjectControllerと名付けます。

それをキューブオブジェクトに貼り付けます。

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

public class ObjectController : MonoBehaviour
{
    public bool selected;
    Controller controller;
    private void Start()
    {
        controller = GameObject.Find("Player").GetComponent<Controller>();
    }
    public void Selected()
    {
        if(!selected && controller.followingPikmins.Count >= 1)
        {
            controller.followingPikmins[0].targetObject = this;
            controller.followingPikmins.RemoveAt(0);
            selected = true;
        }
    }
}

そして、先ほど作ったEvent Trigger/Pointer Clickにキューブオブジェクトを代入し、ObjectController>Selected()を選択します。

これでオブジェクト自体の作成は完了しましたが、Event Triggerを使えるようにしなければいけません。

Event Triggerを使えるようにする

ヒエラルキーでCreate>UI>Event SystemをクリックしてEvent Systemを作成します。

また、プレイヤーの子オブジェクトにあるカメラを選択して、Physics Raycasterコンポーネントを追加します。

これでEvent Triggerが使えるようになりました。

完成

これで完成しました!うまくいけば最初に紹介した動画のように動くはずです。

コメント

タイトルとURLをコピーしました