【Unity】ScriptからPrefabの保存・読み込み


ノートに書き込むペン

Unityで実行中にGameObjectの移動や回転などの操作した状態で、Prefabとして保存したい。次回起動時にロードして続きから作業したいときに使えます。

Prefabの操作

Prefab管理クラスの作成

PrefabMan.csというPrefabを管理するクラスを用意します。
Prefabの書き出し・読み込みを行います。

/*
 * PrefabMan.cs
 * 
 * Copyright (c) 2020 by ConsoleSoup All rights reserved.
 * Created by ConsoleSoup on 2020/02/25.
 * 
 * Blog   :https://consolesoup.com/unity-prefab-read-write/
 * Twitter:https://twitter.com/consolesoup
 * 
 */
#pragma warning disable 0219

using UnityEngine;
using System.Collections;
using System.IO;
using UnityEditor;

/*==============================================================*
 * PrefabMan : GameObjectをprefabとして保存
 *==============================================================*/
public class PrefabMan : MonoBehaviour {
    //「Assets/Resources/」以下のprefabファイルの保存先
    private string prefabDir = "Prefab/";

    /*----------------------------------------------------------*
     * savePrefab : GameObjectをnameのファイル名でprefabとして保存
     *         in : GameObject gameobject
     *            : string name
     *        out : 
     *----------------------------------------------------------*/
    public void savePrefab(GameObject gameobj, string name) {
        //prefabの保存フォルダパス
        string prefabDirPath = Application.dataPath + "/Resources/" + prefabDir;
        if (!Directory.Exists(prefabDirPath)){
            //prefab保存用のフォルダがなければ作成する
            Directory.CreateDirectory(prefabDirPath);
        }

        //prefabの保存ファイルパス
        string prefabPath = prefabDirPath + name + ".prefab";
        if(!File.Exists(prefabPath)){
            //prefabファイルがなければ作成する
            File.Create(prefabPath);
        }

        //prefabの保存
        UnityEditor.PrefabUtility.CreatePrefab("Assets/Resources/" + prefabDir + name + ".prefab", gameobj);
        UnityEditor.AssetDatabase.SaveAssets ();
    }

    /*----------------------------------------------------------*
     * loadPrefab : nameのファイル名で保存してあるprefabを呼び出し
     *         in : string name
     *        out : GameObject gameobject
     *----------------------------------------------------------*/
    public GameObject loadPrefab(string name) {
        //prefabファイルの存在確認
        string prefabPath = Application.dataPath + "/Resources/" + prefabDir + name + ".prefab";
        if(File.Exists(prefabPath)){
            //prefabファイルの読み込み
            string resourcesPath = prefabDir + name;
            GameObject gameobj = (GameObject)Resources.Load<GameObject>(resourcesPath);
            if(gameobj){
                return gameobj;
            }
        }
        return null;
    }
}

保存先を変更したい場合は「string prefabDirPath」のパスを変更してください。
指定できるパスに関しては以下に書いてます。

PrefabMan.csの使い方

  1. PrefabMan.csをUnityプロジェクトに追加
    • UnityプロジェクトのHierarchyに新しいC#ファイル「PrefabMan.cs」を作成。
    • 上のScriptをコピー&ペーストして保存。
  2. 保存・取得したいScriptで以下を記入

利用準備

記入したScriptがComponentとして追加されているGameObjectにPrefabMan.csが追加されていなければ追加。
使用する前に必ず呼ぶ必要がある。

PrefabMan prefabMan = this.gameObject.GetComponent<PrefabMan>();
if (prefabMan == null) {
  prefabMan = this.gameObject.AddComponent<prefabMan>();
}

Prefabの書き出し

上の利用準備で取得したprefabManを使用します。
savePrefabメソッドでGameObjectと保存名を送ってPrefabとして保存します。

GameObject saveobj = 「保存したいGameObject」
prefabMan.savePrefab(saveobj, "保存名");

Prefabの読み込み

上の利用準備で取得したprefabManを使用します。
readPrefabメソッドでPrefab名を指定してPrefabのGameObjectを読み込みます。

読み込んで変更したGameObjectを同じPrefab名で書き出すことで上書きできます。

GameObject loadobj = prefabMan.loadPrefab("保存名");

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です