<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解析 归档 - 初晴神社</title>
	<atom:link href="https://vki.cc/tag/%e8%a7%a3%e6%9e%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://vki.cc/tag/解析/</link>
	<description>白露的博客</description>
	<lastBuildDate>Mon, 30 Jul 2018 14:58:33 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://cdn.vki.cc/wp-content/uploads/2018/03/cropped-icemaplen-1-32x32.png</url>
	<title>解析 归档 - 初晴神社</title>
	<link>https://vki.cc/tag/解析/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>C#中的foreach实现原理</title>
		<link>https://vki.cc/greattruth/language/551/</link>
					<comments>https://vki.cc/greattruth/language/551/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Mon, 30 Jul 2018 14:46:45 +0000</pubDate>
				<category><![CDATA[语言相关]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[解析]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=551</guid>

					<description><![CDATA[<p>我们都知道可以用foreach来遍历数组，List或者Dictionary等等。相比for循环来说，foreach写法简单，不用担心越界问题，也不用强制进行类型转换（下文有分析）。 例如将一个double数组的元素当做int类型输出&#8230;</p>
<p><a href="https://vki.cc/greattruth/language/551/">C#中的foreach实现原理</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>我们都知道可以用foreach来遍历数组，List或者Dictionary等等。相比for循环来说，foreach写法简单，不用担心越界问题，也不用强制进行类型转换（下文有分析）。</p>
<p>例如将一个double数组的元素当做int类型输出，使用for循环可能需要这样写</p>
<pre class="pure-highlightjs"><code class="cs">for (int i = 0; i &lt; doubleArray.Length; i++)
{
      Console.WriteLine((int)doubleArray[i]);
}</code></pre>
<p>但如果使用foreach：</p>
<pre class="pure-highlightjs"><code class="cs">foreach (int i in doubleArray)
{
        Console.WriteLine(i);
}</code></pre>
<p>/************************************************/</p>
<p>回到正题，foreach的原理是什么，或者说怎么实现一个可以被foreach遍历的结构呢？</p>
<p>答案主要在于两个C#接口，<strong>IEnumerable和IEnumerator。</strong></p>
<p><strong><span lang="en-us" xml:lang="en-us">IEnumerable</span><span lang="zh-cn" xml:lang="zh-cn"> </span>接口里有一个方法GetEnumerator。I<span lang="en-us" xml:lang="en-us">Enumerable</span><span lang="zh-cn" xml:lang="zh-cn">的意思是这个集合是可以遍历的，而</span><span lang="en-us" xml:lang="en-us">GetEnumerator</span><span lang="zh-cn" xml:lang="zh-cn">方法返回的</span><span lang="en-us" xml:lang="en-us">IEnumerator</span><span lang="zh-cn" xml:lang="zh-cn">的就是一个遍历器，用这个工具来遍历这个类。</span></strong></p>
<p><strong><span lang="en-us" xml:lang="en-us">IEnumorator</span><span lang="zh-cn" xml:lang="zh-cn">接口中定义的内容包括<span lang="en-us" xml:lang="en-us">Cu</span><span lang="en-us" xml:lang="en-us">rrent</span>，就是返回这个遍历工具所指向的那个容器的当前的元素，MoveNext ()方法就是指向下一个元素，当遍历到最后没有元素时，返回一个<span lang="en-us" xml:lang="en-us">false</span><span lang="en-us" xml:lang="en-us">.</span></span></strong></p>
<p>上代码：School集合里有很多Student</p>
<p>首先定义一个Student类，这个类里有属性Name和构造器：</p>
<pre class="pure-highlightjs"><code class="cs">class Student
{
    public string Name { get; set; };

    public Student()
    {

    }

    public Student(string name)
    {
        Name = name;
    }
}</code></pre>
<p>接下来定义School类，其中包含一个Student数组，构造方法。并继承<strong>IEnumerable</strong>接口并实现<span style="text-decoration: underline;">IEnumerator IEnumerable.GetEnumerator()</span>方法：</p>
<pre class="pure-highlightjs"><code class="cs">class School : IEnumerable
{
    private Student[] students;

    public School(Student[] stus)
    {
        students = (Student[])stus.Clone();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new PeopleEnum(students);
    }
}</code></pre>
<p>其中<code class="cs">PeopleEnum </code> 是继承了<strong>IEnumerator</strong>接口的类型，用于foreach遍历。<strong>IEnumerator</strong>接口中包括了<span style="text-decoration: underline;">object IEnumerator.Current</span>属性和<span style="text-decoration: underline;">public bool MoveNext()，public void Reset()</span>方法。</p>
<p>如果使用了泛型T还会有<span style="text-decoration: underline;">T IEnumerator&lt;T&gt;.Current</span>属性。</p>
<pre class="pure-highlightjs"><code class="cs">class PeopleEnum : IEnumerator
{
    private Student[] students;
    private int index = -1;

    object IEnumerator.Current =&gt; Current;
    public Student Current
    {
        get
        {
            return students[index];
        }
    }

    public PeopleEnum(Student[] stus)
    {
        students= stus;
    }

    public bool MoveNext()
    {
        index++;
        return index &lt; students.Length;
    }

    public void Reset()
    {
        index = -1;
    }
}</code></pre>
<p>我们额外添加了student数组和一个数组下标index。</p>
<p>其中foreach首先调用<code class="cs">MoveNext() </code> 方法，使其下标加1，判断是否越界。如果没有越界就通过Current取出目标值。可以看到如果没有使用泛型的话，返回的是object类型的值，这也是为什么foreach不需要我们进行强制类型转换的原因，即foreach会自动进行转换，缺点就是涉及到装箱拆箱，影响效率。但是这一点可以通过使用泛型避免，有点类似于C#中的ArrayList和List。</p>
<p><a href="https://vki.cc/greattruth/language/551/">C#中的foreach实现原理</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/language/551/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【转】Unity中的序列化</title>
		<link>https://vki.cc/greattruth/engine/276/</link>
					<comments>https://vki.cc/greattruth/engine/276/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sat, 09 Sep 2017 12:34:53 +0000</pubDate>
				<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[解析]]></category>
		<category><![CDATA[转载]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=276</guid>

					<description><![CDATA[<p>What is it?  序列化的概念 长篇大论起来，序列化就是一个将对象的状态信息转换为可以存储或传输到内存，数据库或者文件的过程。简而言之，就是如何存储对象以便后续调用的过程。   假设我们需要定义和存储&#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/276/">【转】Unity中的序列化</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<h2 id="what-is-it-%e5%ba%8f%e5%88%97%e5%8c%96%e7%9a%84%e6%a6%82%e5%bf%b5"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">What is it?  </span></span><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">序列化的概念</span></span></span></strong><span style="font-size: medium;"><strong><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;"><br />
</span></span></strong></span></h2>
<div align="left"><span style="font-size: medium;">长篇大论起来，序列化就是一个将对象的状态信息转换为可以存储或传输到内存，数据库或者文件的过程。简而言之，就是如何存储对象以便后续调用的过程。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">假设我们需要定义和存储一个向量，那这个向量的哪些字段状态我们需要保存起来？很明显是向量的三个分量X.Y,Z啦。您可以考虑将重要的数据进行序列化操作，以便在后续进行反序列化的操作。在这里我们再次简明概括一下序列化以及反序列化。</span></div>
<div align="left"><span style="font-size: medium;">序列化： 将数据结构或对象转换成二进制串的过程</span></div>
<div align="left"><span style="font-size: medium;">反序列化：将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程</span></div>
<div align="left"></div>
<div align="left"><span style="font-size: medium;">正如我们所分析那样，序列化经常用于存储或者转化数据。假设我们在我们的服务器上部署了一个商城，并且正常运行了数据库管理应用。那么，将内存数据（（内存数据断电即丢失））写入硬盘的操作过程就是将对象序列化成数据表的实例。其他平台的数据存储操作，也属于序列化的范畴。</span></div>
<h2 id="how-unity-does-unity%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">How Unity Does  </span></span><span style="font-family: 微软雅黑, sans-serif;">Unity</span><span style="font-family: 微软雅黑, sans-serif;">的序列化工作原理</span></span></strong></h2>
<p><span style="font-size: medium;">Unity作为一个<a class="relatedlink" href="http://www.manew.com/forum-news-1.html" target="_blank" rel="noopener noreferrer">游戏引擎</a>，除了需要从外部（磁盘）加载一大堆资源，如脚本，预设以及场景等到内存，还需要将数据从原生C++端转移到C#端进行托管。序列化操作不仅限于底层数据的加载和存储，它在前端界面也有所应用，如属性窗口，编辑器重定义以及场景对象实例化等。鉴于个人能力有限，您可以在本帖子的延伸阅读（最下方）找寻其他作者关于Unity序列化的博文。我相信处女座的同学会立马谷歌一下。</span></p>
<div align="left"><span style="font-size: medium;">已被序列化的UnityEngine.Object类会提供相应的序列化资源 ：如MonoBehaviour，ScriptableObject（稍后会提到），Shader,Sprite以及Unity的基础内置资源。一般上述资源在游戏开发过程中的调用不可见，除了在脚本编写的环节才有所体现。毕竟在脚本编码过程中，您需要关注哪些字段需要被序列化。如果要对字段进行序列化，您必须遵循以下规则：</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">将该字段定义为public,或者为其添加【SerializeField】的属性</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用static关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用const关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用readonly关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">字段的数据类型必须能序列化</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">通过查询unity文档可知，以下类型可被序列化：</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">带有[Serializable]属性的自定义非抽象类</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">带有[Serializable]属性的自定义结构体</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">继承自UntiyEngine.Object的对象引用</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">基本数据类型（int,float,double,bool,string等）</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">能序列化的字段数组</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">能序列化的线性表</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">需要重点关注的是，自定义的字典类型数据是不能序列化的，就算定义其为公有或附带[SerializeField]属性。鉴于上述原因，在游戏开发过程中，应避免使用字典进行序列化。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">说了那么多，让我们来实战一下。</span></div>
<h2 id="examples-%e6%a1%88%e4%be%8b"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">Examples </span></span><span style="font-family: 微软雅黑, sans-serif;">案例</span></span></strong><span style="font-size: medium;"><span style="font-family: 微软雅黑, sans-serif;"><br />
</span></span></h2>
<div align="left"><span style="font-size: medium;">可复制以下代码到C#文件进行调试：</span></div>
<div align="left">
<pre class="pure-highlightjs"><code class="cs">using UnityEngine;public class MyBehaviour : MonoBehaviour
{
    [SerializeField] private int x = 3;
    [SerializeField] private float y = 5.6f;
    public float pi = 3.1415f;
    private int mySecret = 42;
    public static int myStatic = 10;
    public const int myConst = 22;
    public readonly int myReadOnly = 99;
    public int MyProperty { get { return 100; } }
}</code></pre>
</div>
<div align="left"></div>
<div align="left"><span style="font-size: medium;">根据序列化原则可知，当字段含有static, const, readonly关键字或该字段定义为非公有时，不能被序列化，综上所述仅”x,y和pi”能被序列化。这些能被序列化的字段都可在脚本的属性面板进行查看。</span></div>
<div align="left"><span style="font-size: medium;"> <img  decoding="async"  class="alignnone size-full wp-image-278"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950iagkaazzmd4ieaio.png.thumb_.png"  alt=""  width="274"  height="91" ></span></div>
<div align="left"><span style="font-size: medium;">通过对象克隆的方式，可输出并调试非序列化的字段。以下案例将阐述序列化过程中调用Instantiate方法的过程。</span></div>
<div align="left"></div>
<div align="left">
<pre class="pure-highlightjs"><code class="cs">private void Start()
{
   Debug.Log(“Pi: “ + pi + “. MySecret: “ + x+ “. MyStatic: “ + myStatic);// 译者注：MySecret的值引用的x,不知道是否错误，但我改为mySecrte时，2次输出同为42
}private void Update()
{
   if (Input.GetMouseButtonDown(0))
   {
       pi = –4;
       mySecret = –11;
       myStatic = 13;
       GameObject.Instantiate(gameObject);
   }
}</code></pre>
</div>
<div align="left"><span style="font-size: medium;">运行上述程序并点击鼠标左键时，会在场景中引用当前对象并创建第二个对象。由于第二个对象是第一个对象的拷贝，我们是否可以认为第二个对象的值与第一个对象相同？参照输出列表发现，MySecret的值保持不变（没被序列化），而Pi的值改变了（序列化了）。</span></div>
<div align="left"><span style="font-size: medium;"> <img  decoding="async"  class="alignnone size-full wp-image-279"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950v4by6zynpxg95nss.png.thumb_.png"  alt=""  width="226"  height="69" ></span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">鉴于mySecret字段为private且没附带【SerializeField】属性，所以它不能被序列化。（某些场合私有字段可被序列化）。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">某些场合私有字段可被序列化，这种特殊情况会在【Problems】章节中进行描述。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">细心的读者肯定会发现，字段myStatic的值也发生了改变，那是否意味着它也被序列化了。答案是否定的。虽然控制台所输出的值会让我们认为该字段被序列化，但事实上仅仅因为它是静态字段，而静态字段仅属于类，而不属于类实例。如果我们新建一个空的物体【GameObject &gt; Create Empty】并赋予它该脚本时，运行上述程序时，myStatic的值一样为13(没被序列化)。需要注意的是，Pi的值变为原来的值。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;"><span style="color: #ff0000;"><img  decoding="async"  class="alignnone size-full wp-image-280"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950d2flygiyl29lgyzl.png.thumb_.png"  alt=""  width="233"  height="105" ></span></span></div>
<blockquote>
<div align="left">序列化的意思是说再次读取Unity时序列化的变量是有值的，不需要你再次去赋值，因为它已经被保存下来。</div>
</blockquote>
<div align="left"></div>
<div align="left">
<h2 id="unity%e5%ba%8f%e5%88%97%e5%8c%96">Unity序列化</h2>
<p>在Unity中，在检视面板中可以看到的，就是被成功序列化了的参数。与序列化相关的常用的关键字有SerializeField，HideInInspector，NonSerialized，Serializable并可以组合使用。</p>
<ul>
<li>SerializeField : 表示变量可被序列化。众所周知，公有变量可以在检视面板中看到并编辑，而私有和保护变量不行。SerializeField与private，protected结合使用可以达到让脚本的变量在检视面板里可视化编辑，同时保持它的私有性的目的。</li>
<li>HideInInspector : 将原本显示在检视面板上的序列化值隐藏起来。</li>
<li>NonSerialized :通过此方法可以将一个公有变量不序列化并且不显示在检视面板中。</li>
<li>Serializable：用在类的前面，表示该类可被序列化。</li>
</ul>
<pre class="pure-highlightjs"><code class="cs">public class Test :Monobehavior
{
    public int  a;                               //序列化，显示
    private int b;                               //不序列化，不显示
    [SerializeField ] int c;                     //序列化，显示
    [HideInInspector] public int d;              //序列化，不显示
    [NonSerialized ] public int e;               //不序列化，不显示
    public Test2 test2;                          //序列化，显示（可序列化的部分）
}

[Serializable ]
public class Test2
{
     public int aa;
     private int bb;
}</code></pre>
</div>
<p><a href="https://vki.cc/greattruth/engine/276/">【转】Unity中的序列化</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/276/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Unity3D API之Mathf</title>
		<link>https://vki.cc/greattruth/engine/138/</link>
					<comments>https://vki.cc/greattruth/engine/138/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sun, 18 Jun 2017 03:47:13 +0000</pubDate>
				<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[解析]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=138</guid>

					<description><![CDATA[<p>一组常用的数学函数。 最近在研究U3D的API，感觉太多了不好记，所以在此做了个整理。 全文基于Unity官方文档，萌新能力不足，如果有错误，欢迎指出_(:з」∠)_ [info]静态变量[/info] PI public static float &#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/138/">Unity3D API之Mathf</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>一组常用的数学函数。</p>
<p><span style="color: #999999;">最近在研究U3D的API，感觉太多了不好记，所以在此做了个整理。</span></p>
<p style="text-align: left;"><span style="color: #999999;">全文基于<span style="text-decoration: underline;"><a style="color: #999999; text-decoration: underline;" href="https://docs.unity3d.com/ScriptReference/index.html">Unity官方文档</a></span>，萌新能力不足，如果有错误，欢迎指出_(:з」∠)_</span></p>
<hr />
<p style="text-align: left;">[info]静态变量[/info]
<h2 id="pi" style="text-align: left;">PI</h2>
<p>public static float <span class="sig-kw">PI</span>;【只读】</p>
<p>圆周率的值：3.14159236..</p>
<hr />
[info]静态方法[/info]
<h2 id="abs">Abs</h2>
<p>public static float <span class="sig-kw">Abs</span>(float <span class="sig-kw">f</span>);</p>
<p>求绝对值；</p>
<p>&nbsp;</p>
<p style="text-align: left;">今天写得够多了，先画个饼，明天再写_(:з」∠)_</p>
<p><a href="https://vki.cc/greattruth/engine/138/">Unity3D API之Mathf</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/138/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Unity3D API之GameObject</title>
		<link>https://vki.cc/greattruth/engine/135/</link>
					<comments>https://vki.cc/greattruth/engine/135/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sat, 17 Jun 2017 10:26:08 +0000</pubDate>
				<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[解析]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=135</guid>

					<description><![CDATA[<p>在Unity场景中所有实体的基类。 最近在研究U3D的API，感觉太多了不好记，所以在此做了个整理。 全文基于Unity官方文档，萌新能力不足，如果有错误，欢迎指出_(:з」∠)_ [info]变量[/info] activeInHierarchy &#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/135/">Unity3D API之GameObject</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>在Unity场景中所有实体的基类。</p>
<p><span style="color: #999999;">最近在研究U3D的API，感觉太多了不好记，所以在此做了个整理。</span></p>
<p style="text-align: left;"><span style="color: #999999;">全文基于<span style="text-decoration: underline;"><a style="color: #999999; text-decoration: underline;" href="https://docs.unity3d.com/ScriptReference/index.html">Unity官方文档</a></span>，萌新能力不足，如果有错误，欢迎指出_(:з」∠)_</span></p>
<hr />
<p style="text-align: center;">[info]变量[/info]
<h2 id="activeinhierarchy" class="heading inherit">activeInHierarchy</h2>
<p>public bool <span class="sig-kw">activeInHierarchy</span>;</p>
<p>返回一个bool值，判断游戏物体是否在程序运行时被激活。</p>
<p><a href="http://i4.piimg.com/591392/6bee84458bdb21f2.png" target="_blank" rel="noopener noreferrer"><img  decoding="async"  src="http://i4.piimg.com/591392/6bee84458bdb21f2.png"  alt="Unity3D API之GameObject" ></a></p>
<p>如果父物体被禁用，那么无论面板中是否勾选上，都将返回false。</p>
<h2 id="activeself" class="heading inherit">activeSelf</h2>
<p>public bool <span class="sig-kw">activeSelf</span>;【只读】</p>
<p>返回一个bool值，判断物体在本地活跃状态，不考虑父物体的状态。</p>
<p>即使返回true，如果父物体没有被启用，那么该物体也不会起作用。</p>
<h2 id="isstatic" class="heading inherit">isStatic</h2>
<p>public bool <span class="sig-kw">isStatic</span>;</p>
<p>返回一个bool值，判断物体是否为静态。</p>
<h2 id="layer" class="heading inherit">layer</h2>
<p>public int <span class="sig-kw">layer</span>;</p>
<p>游戏物体所在的层级，范围在[0,31]。</p>
<p>通常用来使摄像机有选择性的渲染或者忽略射线。</p>
<h2 id="scene" class="heading inherit">scene</h2>
<p>public SceneManagement.Scene <span class="sig-kw">scene</span>;</p>
<p>游戏物体所处的场景。</p>
<h2 id="tag" class="heading inherit">tag</h2>
<p>public string <span class="sig-kw">tag</span>;</p>
<p>游戏物体的标签。常用来区分游戏物体的类别。</p>
<h2 id="transform" class="heading inherit">transform</h2>
<p>public Transform <span class="sig-kw">transform</span>;</p>
<p>游戏物体的transform信息。</p>
<h2 id="name-%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobject%e3%80%91">name 【继承】【父类：Object】</h2>
<p>public string <span class="sig-kw">name</span>;</p>
<p>游戏对象的名称。</p>
<p>组件和游戏对象共享的名称。</p>
<hr />
<p style="text-align: center;">[info]构造器[/info]
<div class="signature-CS sig-block">public <span class="sig-kw">GameObject</span>();</div>
<div class="signature-CS sig-block">public <span class="sig-kw">GameObject</span>(string <span class="sig-kw">name</span>);</div>
<div class="signature-CS sig-block">public <span class="sig-kw">GameObject</span>(string <span class="sig-kw">name</span>, params Type[] <span class="sig-kw">components</span>);</div>
<div class="signature-CS sig-block"></div>
<div class="signature-CS sig-block">[kbd]name[/kbd] 创建游戏物体时赋予的名字；</div>
<div class="signature-CS sig-block">[kbd]components[/kbd] 创建游戏物体时添加的组件集合，多个组件之间逗号隔开；</div>
<h2 id="%e6%b3%a8%e6%84%8f%ef%bc%9a" class="signature-CS sig-block">注意：</h2>
<p>创建游戏物体至少且必须会有一个Transform组件；</p>
<pre class="pure-highlightjs"><code class="cs">GameObject player;
player = new GameObject("Player");</code></pre>
<hr />
<p style="text-align: center;">[info] 实例方法[/info]
<h2 id="comparetag" class="heading inherit">CompareTag</h2>
<p>public bool <span class="sig-kw">CompareTag</span>(string <span class="sig-kw">tag</span>);</p>
<p>判断物体的标签是不是[kbd]tag[/kbd]。</p>
<pre class="codeExampleCS">if (other.gameObject.CompareTag("Player"))
            Destroy(other.gameObject);</pre>
<p>（怎么感觉用处不大呢_(:з」∠)_ ）</p>
<h2 id="getcomponent" class="heading inherit">GetComponent</h2>
<p>此方法用于获取游戏物体中第一个符合Type类型的组件。</p>
<p>public T GetComponent&lt;T&gt;();【常用】</p>
[kbd]T[/kbd] 需要检索的组件类型;</p>
<p>public Component <span class="sig-kw">GetComponent</span>(Type <span class="sig-kw">type</span>);</p>
[kbd]type[/kbd] 需要检索的组件类型;</p>
<p>public Component <span class="sig-kw">GetComponent</span>(string <span class="sig-kw">type</span>);</p>
[kbd]type[/kbd] 需要检索的组件名;</p>
<pre class="pure-highlightjs"><code class="cs">Transform transform = GetComponent&lt;Transform&gt;();</code></pre>
<p>使用字符串获取组件的方法可能效率较低，但是适用于从JavaScript中获取C#脚本之类的场合。</p>
<h2 id="getcomponents" class="heading inherit">GetComponents</h2>
<p>public Component[] <span class="sig-kw">GetComponents</span>(Type <span class="sig-kw">type</span>);</p>
<p>作用同上，不过返回的是组件集合。</p>
<p>注意：</p>
<p>在使用该方法时：</p>
<pre class="pure-highlightjs"><code class="cs">Components[] cjs = GetComponents(typeof(Example)) as Component[];   //正确</code></pre>
<p>不可以这样写：</p>
<pre class="pure-highlightjs"><code class="cs">Components[] cjs = GetComponents(typeof(Example)) as Example[];     //错误</code></pre>
<p>因为Example不是Component，而是其子类，建议使用其他泛型方式。</p>
<p>GetComponentsInChildren()同理。</p>
<h2 id="getcomponentinchildren" class="heading inherit">GetComponentInChildren</h2>
<p>获取子物体的组件；</p>
<div class="signature-CS sig-block">public Component <span class="sig-kw">GetComponentInChildren</span>(Type <span class="sig-kw">type</span>);</div>
<div class="signature-CS sig-block">public Component <span class="sig-kw">GetComponentInChildren</span>(Type <span class="sig-kw">type</span>, bool <span class="sig-kw">includeInactive</span>);</div>
<div class="signature-CS sig-block"></div>
<div class="signature-CS sig-block">[kbd]type[/kbd] 需要检索的组件类型;</div>
<div class="signature-CS sig-block">[kbd]includeInactive[/kbd] 是否检索未激活的子物体；</div>
<div class="signature-CS sig-block"></div>
<div class="signature-CS sig-block"></div>
<div class="signature-CS sig-block">其他同GetComponent；</div>
<div class="signature-CS sig-block">
<h2 id="getcomponentsinchildren" class="heading inherit">GetComponentsInChildren</h2>
<p>获取子物体上的指定组件集合。</p>
<p>public Component[] <span class="sig-kw">GetComponentsInChildren</span>(Type <span class="sig-kw">type</span>);</p>
<p>public Component[] <span class="sig-kw">GetComponentsInChildren</span>(Type <span class="sig-kw">type</span>, bool <span class="sig-kw">includeInactive</span>);</p>
<p>同GetComponents和GetComponentInChildren;</p>
<h2 id="getcomponentsinparent" class="heading inherit">GetComponentsInParent</h2>
<div class="signature-CS sig-block">public T[] GetComponentsInParent&lt;T&gt;();<br />
public T[] GetComponentsInParent&lt;T&gt;(bool includeInactive);<br />
public Component[] GetComponentsInParent(Type type, bool includeInactive = false);</div>
<p>获取父物体上指定的组件集合，包括父物体的父物体等等。</p>
[kbd]T[/kbd]，[kbd]type[/kbd] 需要检索的组件类型;</p>
[kbd]includeInactive[/kbd] 是否检索被禁用的组件；</p>
<p>另一个重载方法：</p>
<div class="subsection">
<div class="signature">
<div class="signature-CS sig-block">public void <span class="sig-kw">GetComponentsInParent</span>(bool <span class="sig-kw">includeInactive</span>, List&lt;T&gt; <span class="sig-kw">results</span>);</div>
<div class="signature-CS sig-block">[kbd]results[/kbd] 保存检索到的组件的集合。</div>
<div class="signature-CS sig-block">
<pre class="codeExampleCS">List&lt;HingeJoint&gt; hingeJoints = new List&lt;HingeJoint&gt;();

GetComponentsInParent&lt;HingeJoint&gt;(false, hingeJoints);</pre>
</div>
</div>
</div>
</div>
<div class="clear">
<h2 id="addcomponent" class="heading inherit">AddComponent</h2>
<p>给一个游戏物体添加个组件。</p>
<p>public T <span class="sig-kw">AddComponent&lt;T&gt;</span>(); 【常用】</p>
[kbd]T[/kbd]  需要添加的组件类型;</p>
<p>public Component <span class="sig-kw">AddComponent</span>(Type <span class="sig-kw">componentType</span>);</p>
[kbd]componentType[/kbd] 需要添加的组件类型;</p>
<p>Obsolete public Component <span class="sig-kw">AddComponent</span>(string <span class="sig-kw">className</span>);</p>
[kbd] <span class="sig-kw">className</span>[/kbd] 需要添加的组件名;</p>
</div>
<div class="clear">
<pre class="pure-highlightjs"><code class="cs">SphereCollider sc = gameObject.AddComponent&lt;SphereCollider&gt;() as SphereCollider;
SphereCollider sc = gameObject.AddComponent(typeof(SphereCollider)) as SphereCollider;
SphereCollider sc = gameObject.AddComponent("SphereCollider") as SphereCollider;</code></pre>
<h2 id="setactive" class="heading inherit">SetActive</h2>
<p>public void <span class="sig-kw">SetActive</span>(bool <span class="sig-kw">value</span>);</p>
<p>激活或禁用该对象。</p>
<pre class="pure-highlightjs"><code class="cs">gameObject.SetActive(false);</code></pre>
<p>一个游戏物体可能由于父物体没有激活而没有被激活，这种情况下，调用SetActive()方法将不会使它生效，但是却可以改变他的本地状态，即可以使用activeSelf查看。此时一旦父物体被激活它就会生效。</p>
</div>
<div class="clear"> 如果禁用掉该对象的话将会使它的所有组件生效。</div>
<div class="clear">
<h2 id="sendmessage" class="heading inherit">SendMessage</h2>
<p>public void <span class="sig-kw">SendMessage</span>(string <span class="sig-kw">methodName</span>, object <span class="sig-kw">value</span> = null, SendMessageOptions <span class="sig-kw">options</span> = SendMessageOptions.RequireReceiver);</p>
<p>向一个游戏物体发送消息，调用该物体的所有组件中的目标方法；</p>
[kbd]methodName[/kbd] 需要调用的方法的名字；</p>
[kbd]value[/kbd] 传递给调用方法的参数，可选；</p>
[kbd]options[/kbd] 如果目标游戏物体不存在该方法时是否报错；</p>
<pre class="codeExampleCS">public class ExampleClass : MonoBehaviour {
    void ApplyDamage(float damage) {
        print(damage);
    }
    void Example() {
        gameObject.SendMessage("ApplyDamage", 5.0F);
    }
}</pre>
<p>被调用的方法可以选择是否忽略接收参数 [kbd]object <span class="sig-kw">parameter</span>[/kbd]和消息设置[kbd]SendMessageOptions <span class="sig-kw">options</span>[/kbd] ；</p>
<p>当消息设置为【SendMessageOptions.RequireReceiver】时如果没有一个组件接收到广播的消息的话将会报错。</p>
<p>消息不会发送给未激活的游戏物体（setActive()）；</p>
<h2 id="sendmessageupwards" class="heading inherit">SendMessageUpwards</h2>
<p>public void <span class="sig-kw">SendMessageUpwards</span>(string <span class="sig-kw">methodName</span>, object <span class="sig-kw">value</span> = null, SendMessageOptions<span class="sig-kw">options</span> = SendMessageOptions.RequireReceiver);</p>
</div>
<p>向一个游戏物体发送消息，调用该物体和其父物体的所有组件中的目标方法；</p>
<p>其他同上；</p>
<div class="clear">
<h2 id="broadcastmessage" class="heading inherit">BroadcastMessage</h2>
<p>public void <span class="sig-kw">BroadcastMessage</span>(string <span class="sig-kw">methodName</span>, object <span class="sig-kw">parameter</span> = null, SendMessageOptions <span class="sig-kw">options</span> = SendMessageOptions.RequireReceiver);</p>
<p>广播消息，调用该游戏物体和其所有子物体身上方法名为[kbd]methodName[/kbd]的方法；</p>
<pre class="codeExampleCS">public class ExampleClass : MonoBehaviour {
    void ApplyDamage(float damage) {
        print(damage);
    }
    void Example() {
        gameObject.BroadcastMessage("ApplyDamage", 5.0F);
    }</pre>
<p>被调用的方法可以选择是否忽略接收参数 [kbd]object <span class="sig-kw">parameter</span>[/kbd]和消息设置[kbd]SendMessageOptions <span class="sig-kw">options</span>[/kbd] ；</p>
<p>当消息设置为【SendMessageOptions.RequireReceiver】时如果没有一个组件接收到广播的消息的话将会报错。</p>
<p class="heading inherit" style="text-align: center;">[info] 静态方法[/info]
<h2 id="createprimitive" class="heading inherit">CreatePrimitive</h2>
<div class="subsection">
<div class="signature">
<div class="signature-CS sig-block">public static GameObject <span class="sig-kw">CreatePrimitive</span>(PrimitiveType <span class="sig-kw">type</span>);</div>
<div class="signature-CS sig-block">创建一个带有原始渲染器和碰撞器的游戏物体。</div>
</div>
</div>
<div class="subsection">
[kbd]type[/kbd] 需要创建的游戏物体类型；</p>
[successbox title=&#8221;PrimitiveType&#8221;]Sphere，Capsule，Cylinder， Cube，Plane，Quad[/successbox]
<h2 id="find" class="heading inherit">Find</h2>
<p>public static GameObject <span class="sig-kw">Find</span>(string <span class="sig-kw">name</span>);</p>
<p>通过[kbd]name[/kbd]查找游戏物体并返回该游戏对象。</p>
<pre class="pure-highlightjs"><code class="cs">public class ExampleClass : MonoBehaviour {
    public GameObject hand;
    void Example() {
        hand = GameObject.Find("Hand");
        hand = GameObject.Find("/Hand");
        hand = GameObject.Find("/Monster/Arm/Hand");
        hand = GameObject.Find("Monster/Arm/Hand");
    }
}</code></pre>
<p>这个方法只会查找已启用的游戏对象，如果找不到就返回【null】；</p>
<p>如果name中包含&#8217;/&#8217;，将会在层级面板中像查看目录那样寻找；</p>
<p>因为比较占用资源，所以不建议每帧都调用Find()方法。可以在Start()总调用，或者使用FIndWithTag来代替；</p>
<h2 id="findwithtag" class="heading inherit">FindWithTag</h2>
<div class="subsection">
<div class="signature">
<div class="signature-CS sig-block">public static GameObject <span class="sig-kw">FindWithTag</span>(string <span class="sig-kw">tag</span>);</div>
</div>
</div>
<div class="subsection">
<p>通过[kbd]tag[/kbd]标签查找游戏物体并返回该游戏对象。</p>
<p>这个方法只会查找已启用的游戏对象，如果找不到就返回【null】；</p>
<p>在使用标签之前一定要在标签管理器中声明；</p>
<h2 id="findgameobjectswithtag" class="heading inherit">FindGameObjectsWithTag</h2>
<p>通过[kbd]tag[/kbd]标签查找游戏物体集合。</p>
<p>这个方法只会查找已启用的游戏对象，如果找不到就返回空集合；</p>
<p>如果标签不存在，字符串为空或者null，将抛出异常；</p>
<h2 id="destroy-%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobjective%e3%80%91" class="heading inherit">Destroy 【继承】【父类：Objective】</h2>
<p>public static void <span class="sig-kw">Destroy</span>(Object <span class="sig-kw">obj</span>);</p>
<p>public static void <span class="sig-kw">Destroy</span>(Object <span class="sig-kw">obj</span>, float <span class="sig-kw">t</span> = 0.0F);</p>
<p>移除一个游戏物体或组件。</p>
[kbd]obj[/kbd] 要销毁的游戏对象；</p>
[kbd]t[/kbd] 延迟销毁的时间，单位为秒；</p>
<p>实际销毁的时间在当前循环之后，下次渲染之前如果需要立即销毁，使用DestroImmediately()；</p>
<h2 id="destroyimmediate-%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobjective%e3%80%91" class="heading inherit">DestroyImmediate 【继承】【父类：Objective】</h2>
<p>public static void <span class="sig-kw">DestroyImmediate</span>(Object <span class="sig-kw">obj</span>, bool <span class="sig-kw">allowDestroyingAssets</span> = false);</p>
<p>立即销毁一个游戏对象或组件。</p>
[kbd]allowDestroyingAssets[/kbd] 是否允许assers也被销毁；</p>
<p>可能会发生不可预知的错误，所以如果非特殊需要，建议使用Destroy()；</p>
<h2 id="dontdestroyonload%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobjective%e3%80%91" class="heading inherit">DontDestroyOnLoad【继承】【父类：Objective】</h2>
<p>public static void <span class="sig-kw">DontDestroyOnLoad</span>(Object <span class="sig-kw">target</span>);</p>
<p>使物体不要在加载新的游戏场景时销毁。</p>
<pre class="codeExampleCS">public class ExampleClass : MonoBehaviour {
    void Awake() {
        DontDestroyOnLoad(transform.gameObject);
    }
}</pre>
<p>以为Unity总是在加载新的游戏场景时总会销毁旧场景的所有物体，所有才有了此方法。。。</p>
<p>在Awake()中使用；</p>
<p>如果是游戏物体或组件的话它的Transform信息也将被保留；</p>
<blockquote><p> 不知不觉竟然写了五千多字了。。</p>
<p>脑阔痛 _(:з」∠)_</p></blockquote>
<h2 id="instantiate-%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobjective%e3%80%91" class="heading inherit">Instantiate 【继承】【父类：Objective】</h2>
<div class="signature-CS sig-block">public static Object <span class="sig-kw">Instantiate</span>(Object <span class="sig-kw">original</span>);</div>
<div class="signature-CS sig-block">public static Object <span class="sig-kw">Instantiate</span>(Object <span class="sig-kw">original</span>, Transform <span class="sig-kw">parent</span>);</div>
<div class="signature-CS sig-block">public static Object <span class="sig-kw">Instantiate</span>(Objec t<span class="sig-kw">original</span>, Transform <span class="sig-kw">parent</span>, bool <span class="sig-kw">instantiateInWorldSpace</span>);</div>
<div class="signature-CS sig-block">public static Object <span class="sig-kw">Instantiate</span>(Object <span class="sig-kw">original</span>, Vector3 <span class="sig-kw">position</span>, Quaternion <span class="sig-kw">rotation</span>);</div>
<div class="signature-CS sig-block">public static Object <span class="sig-kw">Instantiate</span>(Object <span class="sig-kw">original</span>, Vector3 <span class="sig-kw">position</span>, Quaternion <span class="sig-kw">rotation</span>, Transform <span class="sig-kw">parent</span>);</div>
</div>
</div>
</div>
<div class="signature-CS sig-block">实例化一个游戏对象并返回该对象。</div>
<div class="signature-CS sig-block"><span class="sig-kw">[kbd]original[/kbd] 需要实例化的游戏对象，常是预制体；</span></div>
<div class="signature-CS sig-block">[kbd]parent[/kbd] 父物体的Transform（如果需要制定父物体的话）；</div>
<div class="signature-CS sig-block">[kbd]instantiateInWorldSpace[/kbd] 如果指定了父物体，需要相对于父物体来确定新物体的所在位置的话，就设为【false】；反之如果要保留新物体本身在世界坐标系的位置信息，就设为【true】；</div>
<div class="signature-CS sig-block">[kbd]position[/kbd] 新游戏对象的位置；</div>
<div class="signature-CS sig-block">[kbd]rotation[/kbd] 新游戏对象的旋转信息；</div>
<div class="signature-CS sig-block">
<pre class="pure-highlightjs"><code class="cs">Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);</code></pre>
<p>新游戏物体的子物体也会跟着实  【父类：Objective】</p>
<p>public static Object <span class="sig-kw">FindObjectOfType</span>(Type <span class="sig-kw">type</span>);</p>
</div>
<p>查找指定类型的对象。</p>
<pre class="pure-highlightjs"><code class="cs">GUITexture texture = (GUITexture)FindObjectOfType(typeof(GUITexture));</code></pre>
<p>返回第一个找到的；</p>
<p>该方法效率较低，不建议每帧都调用；</p>
<h2 id="findobjectsoftype-%e3%80%90%e7%bb%a7%e6%89%bf%e3%80%91%e3%80%90%e7%88%b6%e7%b1%bb%ef%bc%9aobjective%e3%80%91" class="heading inherit">FindObjectsOfType 【继承】【父类：Objective】</h2>
<p>public static Object[] <span class="sig-kw">FindObjectsOfType</span>(Type <span class="sig-kw">type</span>);</p>
<p>查找指定类型的对象集合。</p>
<p>其他同上；</p>
<p style="text-align: center;">[info]操作符[/info]
<h2 id="bool" style="text-align: left;">bool</h2>
<p>描述游戏物体是否存在。</p>
<pre class="codeExampleCS">public class ExampleClass : MonoBehaviour {
    void Example() {
        if (rigidbody)
            Debug.Log("Rigidbody attached to this transform");
        
    }
}</pre>
<hr />
<p style="text-align: center;"><span style="color: #999999;">完</span></p>
<p><a href="https://vki.cc/greattruth/engine/135/">Unity3D API之GameObject</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/135/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
