天道酬勤,学无止境

Unity3d - C# - 如何备份数组的值?(Unity3d - C# - How can I back up of values of an array?)

问题

我在脚本 (C#) 中定义了一个包含 67 个元素的数组。 每个元素都是我定义的包含一些变量的类的对象。 如下图:

// the Definition of the array
public Pack[] packsInfo;

// the class 
[Serializable]
public class Pack
{
    public int number;
    public int angle;
    public float zPosition;
    public float beatCaseDistance;
    public float gunDistance;
}

然后,我在 Inspector 中分​​配所有值。 像下面:

所以...如果我突然更改任何值或更糟,(值因任何原因消失。比如更改类参数或任何事情)那么我必须花几个小时来设置所有值。 所以我想打印文本或文件中的所有值并保存它们。 以便稍后恢复它们。 我想要一个备份解决方案。我想用编程来做。 (我不想手动编写它们;)。这是浪费时间。 )

回答1

要保存您的数组,您可以使用例如 JsonUtillity。

很简单! 祝你好运!

 void Start () {
    /////////////////////// save to json
    JSONObject jsonSave = new JSONObject();
    for(int i=0; i < packsInfo.Length; i++) {
        JSONObject packJson = new JSONObject();
        packJson.AddField("number", packsInfo[i].number);
        packJson.AddField("angle", packsInfo[i].angle);
        packJson.AddField("z_position", packsInfo[i].zPosition);
        packJson.AddField("beat_case_distance", packsInfo[i].beatCaseDistance);
        packJson.AddField("gun_distance", packsInfo[i].gunDistance);
        jsonSave.Add(packJson);
    }

    System.IO.StreamWriter streamWritter = new System.IO.StreamWriter(@"C:\MyGameFiles\packs.json");
    streamWritter.WriteLine(jsonSave.Print(true));
    streamWritter.Close();
    streamWritter = null;
    /////////////////////// read json
    System.IO.StreamReader reader = new System.IO.StreamReader(@"C:\MyGameFiles\packs.json");
    string jsonString = reader.ReadToEnd();
    reader.Close();
    reader = null;

    JSONObject jsonRead = new JSONObject(jsonString);
    packsInfo = new Pack[jsonRead.Count];
    for(int i =0; i < jsonRead.Count; i ++) {
        Pack pack = new Pack();
        pack.number = (int)jsonRead[i]["number"].i;
        pack.angle = (int)jsonRead[i]["angle"].i;
        pack.zPosition = jsonRead[i]["z_position"].f;
        pack.beatCaseDistance =jsonRead[i]["beat_case_distance"].f;
        pack.gunDistance = jsonRead[i]["gun_distance"].f;
        packsInfo[i] = pack;
    }
}
回答2

您可以通过创建一个编辑器脚本来实现此目的,该脚本获取数组中的所有值并通过 IO 将它们保存到指定文件。 从那里您可以轻松地创建一个带有文件读取的加载功能。

以下是一些可帮助您入门的链接:

Unity 编辑器脚本

unity 读写文件

回答3

我知道这已被多次回答,但我建议您使用 Newtonsoft Json 库。 它为您自动执行对象的序列化和反序列化,以便在您更改 json 将适应的对象时无需进行特定更改。

要序列化,您只需执行以下操作:

string json = JsonConvert.Serialise(packsInfo); //convert to text
File.WriteAllText(path, json); //Save to disk

要反序列化,您只需执行以下操作:

string json = File.ReadAllLines(path); //load the file
packsInfo = JsonConvert.DeserializeObject<Pack[]>(json); //convert to an object

这就是保存和加载数据所需要做的全部工作。 要获取库,您可以使用 NuGet 将库添加到项目中。 在 Visual Studio 中转到 Tools -> NuGet package Manager -> Manage NuGet Packages for Solution 然后转到浏览选项卡并搜索它。

回答4

如果您没有特别的理由在编辑器(公共)中序列化变量,我建议您按照以下步骤将它们删除为公共:

  1. 设置所有值并打印后,使用 JsonUtility 并将您的类序列化为 json。

.

var json = JsonUtility.ToJson(packsInfo);
Debug.Log(json);
  1. 现在,当您开始游戏时,该类将显示在您的控制台中,然后您可以复制该 json 并将其保存在文本文件中,例如“MyFile.txt”

  2. 将该文本文件添加到项目中,并使用以下任一方法将其加载到您的游戏中:

    • 为它创建一个公共字段并将文件拖到该字段:

      公共文本资产包信息资产;

    • 将其添加到名为Resources的文件夹中,然后使用以下代码获取文件:

      var packInfoAsset = Resources.Load("MyFile"); // 注意没有文件结尾(.txt)

  3. 最后,将 json 反序列化为您之前的对象,因此当您加载类时,在您的 Start 方法中,您执行以下操作:

    packsInfo = JsonUtility.FromJson<Pack>(packInfoAsset);

好了,您已经从文件中加载了数据,而不是将其保存在编辑器中。

回答5

您可以将数据保存到可以作为资产存储的 ScriptableObject。

首先,用 ScriptableObject 类包装你的数组:

using UnityEngine;
using System.Collections;

public class PacksInfo: ScriptableObject
{
    public Pack[] packs;
}

然后创建一个编辑器脚本以从 Unity 编辑器菜单生成 ScriptableObject。

using UnityEngine;
using System.Collections;
using UnityEditor;

public class CreatePacksInfo
{
    [MenuItem("Assets/Create/Packs Info")]
    public static PacksInfo Create()
    {
        TextAsset json = (TextAsset) 
        AssetDatabase.LoadAssetAtPath("Assets/RawData/PacksInfo.json", 
        typeof(TextAsset));
        PacksInfo asset = ScriptableObject.CreateInstance<PacksInfo>();
        JsonUtility.FromJsonOverwrite(json.text, asset);

        AssetDatabase.CreateAsset(asset, "Assets/Data/PacksInfo.asset");
        AssetDatabase.SaveAssets();
        return asset;
    }
}

在这种情况下,我基于 json 文件创建资产。 如果您喜欢在 Unity Editor 中手动填充它们,您还可以将您的数组分配给 PackInfo 对象。

当你想使用数据时,你可以声明一个 PackInfo 变量:

public class something: MonoBehaviour
{
    public PacksInfo packsInfo;
}

然后将您直接从 Unity 编辑器生成的 ScriptableObject 资产拖到检查器中的变量中。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Unity3d - C# - How can I back up of values of an array?
    I Defined an array of 67 elements in a script (C#). Each element is an object of a class that I defined that includes some variables. Like Below: // the Definition of the array public Pack[] packsInfo; // the class [Serializable] public class Pack { public int number; public int angle; public float zPosition; public float beatCaseDistance; public float gunDistance; } Then, I Assign all the values in Inspector. like Below: So ... if i suddenly change any of the values or even worse, ( the values gone for a any reason. like changing the class parameters or any thing ) then I must spend hours on
  • 如何让相机跟随 unity3d C# 中的对象?(How do I make a camera follow an object in unity3d C#?)
    问题 我有一个名为 Ball 的对象,我向它添加了键盘交互性(WASD 以移动球)我需要相机留在后面并跟随球,但是我遇到了错误。 using UnityEngine; using System.Collections; public class ballmain : MonoBehaviour { public bool isMoving = false; public string direction; public float camX; public float camY; public float camZ; // Use this for initialization void Start () { Debug.Log("Can this run!!!"); } // Update is called once per frame void Update () { camX = rigidbody.transform.position.x -=10; camY = rigidbody.transform.position.y -=10; camZ = rigidbody.transform.position.z; camera.transform.position = new Vector3(camX, camY, camZ); //followed by code
  • 如何在 Unity3D 中使用 C# 延迟?(How to make a delay with C# in Unity3D?)
    问题 我刚开始在 unity 中学习 c#。 我跟着教程,但我想添加一些东西。 using UnityEngine; using UnityEngine.UI; using System.Collections; public class PlayerController : MonoBehaviour { public float speed; public Text countText; public Text winText; private Rigidbody rb; private int count; void Start () { rb = GetComponent<Rigidbody>(); count = 0; SetCountText (); winText.text = ""; } void FixedUpdate () { float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical); rb.AddForce (movement * speed); } void
  • C# Unity3D 中未分配的引用异常(Unassigned reference exception in C# Unity3D)
    问题 我有一个玩家类,我正在更新一个名为Target的 Transform,而 Target 属于Projectile类。 这是我所做的,它工作得很好: _pro.Target.transform.position = new Vector3(posi.x, posi.y, posi.z); //value gets assigned to Target here Instantiate (bulletprefab, position, Quaternion.identity); //projectile is attached to bulletprefab so projectile gets called from here 现在,在射弹中,在尝试访问Target.transform.position ,它给出了 UnassignedReferenceException :射弹的变量“Target”尚未分配。 我成功地为玩家类中的Target赋值,如何在弹丸中访问相同的值? 回答1 您的主要问题是您试图在实例化包含该变量的对象之前更新该变量的值。 由于您的Projectile类具有对目标的引用,因此您首先需要对Projectile类实例的引用。 所以实例化你的对象,然后找到Projectile类。 GameObject g = Instantiate
  • 如何将 JNI C# 类传递给 Java 或处理这种情况?(How to pass a JNI C# class into Java or handle this situation?)
    问题 我正在尝试从 C# 调用 Java 方法,它在 java 中是这样调用的: EgamePay.pay(thisActivity, payAlias, new EgamePayListener() { @Override public void paySuccess(String alias) { } @Override public void payFailed(String alias, int errorInt) { } @Override public void payCancel(String alias) { } }); 前两个参数没问题,但是如何在 C# 中传递 EgamePayListner 呢? 简单地创建一个具有相同功能的 C# 类是行不通的... 这是我目前正在做的事情: using (AndroidJavaClass jc = new AndroidJavaClass("cn.egame.terminal.smspay.EgamePay")) { System.IntPtr cls_Activity = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer"); System.IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity,
  • 如何在 Android 平台的 unity3d 中使用 c# 线程?(how to use c# threads in unity3d for android platform?)
    问题 我需要在线程中加载文件、场景和播放动画.. 尝试在 Android 中通过 www 加载文件...如何通过线程做其他事情? 但是为什么游戏引擎不允许我们创建线程呢? 还是我的理解有误? 如何在 UNITY3D 中创建线程? 回答1 您可以在 Unity 中使用线程,但引擎不是线程安全的。 通常你运行分离的线程(从 Unity UI)来执行长时间运行的进程并检查结果(你不能从工作线程与 Unity 交互)。 常见的方法是使用一个表示线程作业的类,该作业将由 Unity 主线程初始化。 然后你在那个类的函数上启动一个工作线程,让它完成它的工作(协程在 Unity 主线程上运行,所以不是真正的线程。关于协程的最佳文章在这里) 这是上述方法的示例(请参阅已接受的答案): http://answers.unity3d.com/questions/357033/unity3d-and-c-coroutines-vs-threading.html 您可能还想尝试一个 UnityGems 包,它可以实现相同的效果但提供便利(例如闭包支持)。 看这个页面 哈。 最好的! 回答2 根据我个人使用 Unity 的经验,除非线程不使用任何 Unity 的 api,否则您无法创建/运行单独的线程。 所以这意味着没有游戏对象或类似性质的东西。我自己已经成功地完成了我自己的寻路,所以我知道这是可能的。
  • 【Unity3D】用 Unity3D / C# 如何获取 Android 外置 SD 卡的路径
    上次在文章《打包的Android应用如何播放本地视频及外置SD卡的视频》中整理了一下读取并播放外置 SD 卡中的视频的方法。上篇文章侧重于解决读取并播放外置 SD 卡中的本地视频,而本文会详细讲解如何在 Unity 中自动获取 SD 卡的路径(因为不同的 SD 卡,它的路径不同,所以最好的方法是让程序自动获取 SD 路径而不是代码中写死)。总体思路就是,在 Android 中将获取 SD 卡路径的方法打成 Jar 包,然后在 Unity 中调用。 1. 打 Jar 包 在 Android 中获取外置 SD 卡路径的代码,在之前的文章中已经说过。这里对其进行了削微的改动,然后将其打成 Jar 包。public class GetSdcardNameUtil { private static final String TAG = GetSdcardNameUtil.class.getSimpleName(); /** * @param mContext context对象,传入activty对象即可 * @param is_removale 存储否可以移除,如果是外置sdcard,is_removale应该传入true * @return */ public static String getStoragePath(Context mContext, boolean is
  • 无法将事件从Unity传递回android库jar(Can't pass back event from Unity to android library jar)
    问题 我是Unity的新手,我正在尝试为Android库jar创建一个Unity插件,但遇到了以下问题: 我找不到将后退按钮事件传递给Android库的方法。 看来Unity阻止了此事件被传递到库层。 我设法做到的是通过设置以下行来将触摸事件传递给Android端的活动 <meta-data android:name="unityplayer.ForwardNativeEventsToDal vik" android:value="true" /> 在AndroidManifest中的<activity android:name="com.unity3d.player.UnityPlayerProxyActivity" ... > 但是,我无法以不必更改库中代码的方式传递后退按钮事件 我现在在脚本中所做的是 public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); } 但是,我需要选择将捕获到的该后退事件传递给库,而不是在Unity层进行处理。 也许是这样的。 myActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 或这个 myActivity
  • 通过 Unity3D 和 MonoDevelop 编译 C#(Compiling C# via Unity3D and MonoDevelop)
    问题 我正在使用 Unity3D v4.2.2f1,并且它附带的 MonoDevelop 版本 - v2.8.2。 我看到有些情况下 C# 代码会在 Unity3D 中编译,但不能在 MonoDevelop 中编译。 例如,Unity3D 接受方法参数的默认值,但在 MonoDevelop 中导致“不允许默认参数设置(CS0241)”。 我在网上找到的一般建议是不要尝试从 MonoDevelop 编译。 很好 - 但我很想了解这种不匹配是如何产生的。 我认为 Unity3D 和 MonoDevelop 都使用 Mono 编译 C#? 是不是Unity3D自带两个版本的Mono,一个是自己用的,一个是MonoDevelop的? 如果是这样,为什么? 在 Unity 中编译但不在 MonoDevelop 中编译的示例第一行方法(不在 MonoDevelop 中编译但从 Unity3D 编译的位是对 setNative 的“=false”赋值): public static void SetUnityVersion(string path, bool setNative=false) { ...implementation... } 回答1 在 Windows 上与 Unity 一起安装时,MonoDevelop 默认使用 Microsoft .Net Framework。
  • 使用C#从Unity3D的输入字段中获取文本(Get text from Input field in Unity3D with C#)
    问题 我正在尝试使用C#在Unity3D的inputField内获取文本。 我已将inputField放置在编辑器中,并在其中重命名并标记为: Username_field 。 我的问题是:如何在C#脚本中的InputField Username_field中获取文本? 回答1 将下面的单行为脚本附加到InputField gameObject: public class test : MonoBehaviour { void Start () { var input = gameObject.GetComponent<InputField>(); var se= new InputField.SubmitEvent(); se.AddListener(SubmitName); input.onEndEdit = se; //or simply use the line below, //input.onEndEdit.AddListener(SubmitName); // This also works } private void SubmitName(string arg0) { Debug.Log(arg0); } } 另请参见以下动画: 回答2 您可以使用InputField的“值更改时”或“结束编辑”事件。
  • 按下按钮时的循环功能? Unity3d C#(Loop function on button press? Unity3d C#)
    问题 所以,我有一个对象。 当我按下旋转按钮时,我希望它旋转。 当我按下停止按钮时,我希望它停止。 当它在 void Update 中时它旋转得很好,但是当它在它自己的函数中时,它只做一次。 我尝试使用循环,但仍然没有运气。 有人可以帮我吗? C#代码: using UnityEngine; using System.Collections; using UnityEngine.UI; public class spin : MonoBehaviour { public float speed = 500f; public Button starter; public Button stopper; int testing = 200; void Start () { Button btn = starter.GetComponent<Button> (); Button butn = stopper.GetComponent<Button> (); butn.onClick.AddListener(FidgetSpinnerStop); btn.onClick.AddListener(FidgetSpinnerStart); } void FidgetSpinnerStart () { for (int i = 0; i < testing; i++) { transform
  • Unity3D 寻找 setPixels 示例以在 C# 中绘制纹理(Unity3D looking for setPixels example to paint with texture in C#)
    问题 我需要找到一种允许我使用纹理绘制游戏对象的方法,目标是制作该游戏的克隆 我已经认为我可以通过使用我在这里解释的 depthMask 解决方案来伪造绘画功能,但是,经过数小时的研究,似乎可以使用 setPixels、setPixel 和 setPixels32 来创建真正的绘画,但出于某种原因,所有与 setPixels 相关的Script Reference 中的主题是 JavaScript,我试图将它移植到 c#,但我总是遇到错误,而且它是一种复杂的方法,并且脚本参考没有很好地解释它,所以我希望任何人都可以写信使用 setPixels 以使用另一个纹理更改对象纹理的一部分的示例? 或者我们可以将整个对象的 alpha 设置为 0,当我们点击它时,我们将该纹理 alpha 的一部分更改为 1 ? 我真的希望这个话题不会因为它的多样性而被关闭,我在解释整个情况的同时尽力提出一个直截了当的问题。 谢谢 编辑: 几个小时后,我得到了一个非常酷的结果,我认为这是实现我的目标的好方法,这个脚本允许用另一个选择的纹理替换材质纹理中的特定像素(目标纹理必须大小相同且可读) // the texture that i will paint with public Texture2D targetTexture ; //temporary texture Texture2D
  • 使用 JavaScript 和/或 C# (Unity3D) 从 PHP 脚本加载一些变量(Load some variables from PHP Script using JavaScript and/or C# (Unity3D))
    问题 我在 Unity 游戏引擎中有一个困难的项目,我需要创建从服务器上的 PHP 文件加载变量的脚本。 我的 PHP 脚本是: <?php $MasterServer = "SomeIP1"; $MasterServer2 = "SomeIP2"; $MasterServer3 = "SomeIP3"; echo "1 Server = ".$MasterServer; echo "2 Server = ".$MasterServer2; echo "3 Server = ".$MasterServer3; ?> 这样做的结果: 1 Server = SomeIP1 2 Server = SomeIP2 3 Server = SomeIP3 如何在 C# 和/或 JS (Unity3D) 中读取这些(作为变量)? 回答1 不要那样做。 这是对您问题的适当回答。 使用 xml 或 json 来保存数据。 在 php 端,将所有这些数据构造成一个 json 字符串。 在 C# 端,使用 WWW 类接收它,然后将 json 反序列化为对象。 然后您可以从中访问 1 Server、2 Server 和 3 Server 数据。 PHP : 发送到 Unity: {"server1":"SomeIP1","server2":"SomeIP2","server3":"SomeIP3"}
  • c# 泛型,涵盖数组和列表?(c# generic, covering both arrays and lists?)
    问题 这是一个非常方便的扩展,它适用于任何array : public static T AnyOne<T>(this T[] ra) where T:class { int k = ra.Length; int r = Random.Range(0,k); return ra[r]; } 不幸的是,它不适用于List<>的任何内容。 这是适用于任何List<>的相同扩展 public static T AnyOne<T>(this List<T> listy) where T:class { int k = listy.Count; int r = Random.Range(0,k); return listy[r]; } 事实上,有没有一种方法可以一次性概括涵盖array和List<>的泛型? 或者知道不可能? 答案甚至(喘气)可以包含Collection吗? PS,我很抱歉没有明确提到这是在 Unity3D 环境中。 例如,“Random.Range”只是一个 Unity 调用(这是显而易见的),而“AnyOne”是游戏编程中完全典型的扩展或调用。 显然,这个问题当然适用于任何 c# 环境。 回答1 实际上,对于您的情况, T[]和List<T>之间最合适的通用接口是IReadOnlyList<T> public static T AnyOne<T>(this
  • 带有 unity3D 的 Visual Studio 不会像以前那样工作 [重复](Visual studio with unity3D wont work like it used to be [duplicate])
    问题 这个问题在这里已经有了答案: 在 Visual Studio 中编辑的 Unity 脚本不提供自动完成功能(28 个回答) 3年前关闭。 我已经在互联网上搜索了一个星期我在升级到统一 5.3.2 或 5.3.3 时找不到任何解决方案我不记得它只是破坏了我的视觉工作室,即使我升级到统一 5.4 测试版仍然无法正常工作解决这个问题? 我绝望并且需要使用visual studio,因为它更容易和用户友好的代码编辑器 没有颜色(没有智能感知),当我尝试使用像 transform.rotatetoward 这样的 unity3d 变量时,它没有显示任何内容 在这里它说我启用了我的视觉工作室工具 我尝试了无数种方法来解决互联网上的问题 通过重新安装 unity3d 和 Visual Studio 删除所有 .sln、.csproject、vscode 文件夹,以便 unity 生成新文件夹我尝试使用插件将 unity 与 Visual Studio 连接起来 它只是不工作了 我的视觉工作室信息 微软visual studio社区2015版14.0.23107.0 D14REL 已安装产品 Visual Basic 2015 00322-20000-00000-AA455 Visual c# 2015 00322-20000-00000-AA455 Visual C++ 2015
  • 如何在 Unity3D 中使用 C++ dll?(How to use a C++ dll in Unity3D?)
    问题 我知道这个类似的问题,但它没有回答我的问题。 我已经使用 Visual Studio 2010 编写了两个.dll 。一个使用 C++,并与使用 C++ 编写的 SDK 进行通信。 另一个是该 C++ 库的 C# 包装器,以便它可以在 C# 上下文中使用。 我的计划是这会让我在Unity3D使用我的代码,但显然情况并非如此。 如果.dll不是.NET程序集,似乎Unity3D不允许我将.dll作为资产导入。 所以我可以添加我的 C# 包装器,但不能添加 C++ dll。 每当我尝试访问 C++ 库时,这都会导致DllNotFoundException 。 我曾尝试简单地将 C++ 库复制到Assets/Plugins文件夹中,但结果相同。 有没有办法正确地做到这一点? 这是我的项目设置中非常重要的一部分。 回答1 问题是当 p/invoke 运行时代码调用LoadLibrary(YourNativeDllName)时没有找到 DLL。 您可以通过确保您的 DLL 在第一次 p/invoke 调用时位于 DLL 搜索路径上来解决此问题。 例如通过调用 SetDllDirectory。 我个人更喜欢的解决方案是让您的托管代码 p/invoke 对LoadLibrary的调用,将完整的绝对路径传递给本机 DLL。 这样,当后续 p/invoke 引发对LoadLibrary
  • How to make a delay with C# in Unity3D?
    I just started to learn c# in unity. I followed a tutorial, but i wanna add some things. using UnityEngine; using UnityEngine.UI; using System.Collections; public class PlayerController : MonoBehaviour { public float speed; public Text countText; public Text winText; private Rigidbody rb; private int count; void Start () { rb = GetComponent<Rigidbody>(); count = 0; SetCountText (); winText.text = ""; } void FixedUpdate () { float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical)
  • Unity3D 脚本(c# 脚本、JavaScript)中的“this”关键字(The 'this' keyword in Unity3D scripts (c# script, JavaScript))
    问题 我很困惑: 代码 (CS01.cs) 该脚本附加到一个简单的 Cube 对象。 using UnityEngine; using System.Collections; public class CS01 : MonoBehaviour { // Use this for initialization void Start () { Debug.Log (this); //--> Cube(CS01) Debug.Log (this.GetType()); //--> CS01 Debug.Log (this.GetType() == typeof(UnityEngine.GameObject)); //--> False Debug.Log (this == gameObject); //--> False Debug.Log (this.name); //--> Cube Debug.Log (gameObject.name); //--> Cube this.name = "Hello"; // --> Will get the gameObject's name changed to 'Hello' Debug.Log (gameObject.name); //--> Hello } // Update is called once per frame void
  • Unity3D面试题+答案
    第一部分 1. 请简述值类型与引用类型的区别 答:区别: 1. 值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址。 2. 值类型存取快,引用类型存取慢。 3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。 4. 栈的内存是自动释放的,堆内存是 .NET 中会由 GC 来自动释放。 5. 值类型继承自 System.ValueType, 引用类型继承自 System.Object 。 可参考 http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html 2. C# 中所有引用类型的基类是什么 答:引用类型的基类是 System.Object 值类型的基类是 System.ValueType 同时,值类型也隐式继承自 System.Object 3. 请简述 ArrayList 和 List 的主要区别 答: ArrayList 存在不安全类型 ‘ ( ArrayList 会把所有插入其中的数据都当做 Object来处理) 装箱拆箱的操作(费时) List 是接口, ArrayList 是一个实现了该接口的类,可以被实例化。 4. 请简述 GC (垃圾回收)产生的原因,并描述如何避免? 答: GC 回收堆上的内存 避免: 1 )减少 new 产生对象的次数
  • Compiling C# via Unity3D and MonoDevelop
    I'm using Unity3D v4.2.2f1, and the version of MonoDevelop it comes bundled with - v2.8.2. I see that there are cases where C# code will compile in Unity3D, but not in MonoDevelop. For instance, default values for method arguments are accepted by Unity3D, but result in "Default parameter settings are not permitted (CS0241)" in MonoDevelop. General advice I've found online is to not attempt to compile from MonoDevelop. Fine - but I'm keen to understand how this mismatch arises. I thought that both Unity3D and MonoDevelop compile C# using Mono? Is it that Unity3D comes with two versions of Mono