zoukankan      html  css  js  c++  java
  • 【Unity3d】ScriptableObject的简单用法

     

    ScriptableObject非常适合小数量的游戏数值。

    使用ScriptableObject的时候需要注意,生成ScriptableObject数据文件需要自己写Editor代码实现。

    大概的工作流程是:写一个ScriptableObject(继承ScriptableObject的类,相当于数据模板) → 使用自己写的Editor代码生成一个实现该模板的数据文件 → Inspector面板中编辑数据。

    给出我的Editor代码:

    using UnityEngine;
    using System.IO;
    using System.Collections;
    using UnityEditor;
    
    public class Scriptablity : MonoBehaviour {
    
    	public static T Create<T> ( string _path, string _name) where T : ScriptableObject {
            
    		if ( new DirectoryInfo(_path).Exists == false ) {
                Debug.LogError ( "can't create asset, path not found" );
                return null;
            }
            if ( string.IsNullOrEmpty(_name) ) {
                Debug.LogError ( "can't create asset, the name is empty" );
                return null;
            }
            string assetPath = Path.Combine( _path, _name + ".asset" );
            
            T newT = ScriptableObject.CreateInstance<T>();
            AssetDatabase.CreateAsset(newT, assetPath);
            Selection.activeObject = newT;
            return newT;
        }
    	
    	public static void  Create<T>() where T : ScriptableObject {
    		
    		string assetName = "New " + typeof(T).Name;
    		string assetPath = "Assets";
    		if(Selection.activeObject) {
    			assetPath = AssetDatabase.GetAssetPath(Selection.activeObject);
    			if (Path.GetExtension(assetPath) != "") 
    			{
    				assetPath = Path.GetDirectoryName(assetPath);
    			}
    		}
    		
    		bool doCreate = true;
            string path = Path.Combine( assetPath, assetName + ".asset" );
            FileInfo fileInfo = new FileInfo(path);
            if ( fileInfo.Exists ) {
                doCreate = EditorUtility.DisplayDialog( assetName + " already exists.",
                                                        "Do you want to overwrite the old one?",
                                                        "Yes", "No" );
            }
            if ( doCreate ) {
                T T_info = Create<T> ( assetPath, assetName );
                Selection.activeObject = T_info;
            }
    	}
    	
    	public static void Create() {
    		
    		Debug.LogError("You should call 'Create' method like this : Create<ExampleData>();");
    	}
    }
    

    使用方法:

    1.写个ScriptableObject。

    public class Example : ScriptableObject {
            public int id;
            public string name;
    }

    2.写个MonoBehavior调用Create方法生成Example格式的数据。

    public class ExampleItem: MonoBehaviour {
    
            [MenuItem("Example/Create/Example Data")]
            static void CreatExample() {
    
                    Scriptablity.Create<Example>();
            }
            
    }
    

    3.在Inspector面板编辑数据。

    4.使用该数据

    public class ExampleUsage : MonoBehavior {
           public Example exampleInfo;
    
           void Start()
           {
                   Debug.Log(exampleInfo.name);
           }
    
    }
    
  • 相关阅读:
    第六届蓝桥杯JavaA组国(决)赛真题
    第六届蓝桥杯JavaA组国(决)赛真题
    第六届蓝桥杯JavaA组国(决)赛真题
    第六届蓝桥杯JavaA组国(决)赛真题
    C++ 实现 发送HTTP Get/Post请求 good
    Qt 窗口属性简介之Qt::WA_DeleteOnClose
    Qt 之 使用 https发送 HTTP请求(使用OPENSSL库)
    Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例
    delphi android 录像(调用Java的功能)
    MVC 插件式开发
  • 原文地址:https://www.cnblogs.com/LoadingChan/p/3380741.html
Copyright © 2011-2022 走看看