<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://startnight.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://startnight.github.io/" rel="alternate" type="text/html" /><updated>2026-04-04T14:16:22+00:00</updated><id>https://startnight.github.io/feed.xml</id><title type="html">Felix</title><subtitle>康的个人博客</subtitle><author><name>康</name></author><entry><title type="html">Unity Shader 图片滚动效果</title><link href="https://startnight.github.io/2021/09/07/UnityShader%E5%9B%BE%E7%89%87%E6%BB%9A%E5%8A%A8%E6%95%88%E6%9E%9C/" rel="alternate" type="text/html" title="Unity Shader 图片滚动效果" /><published>2021-09-07T00:00:00+00:00</published><updated>2021-09-07T00:00:00+00:00</updated><id>https://startnight.github.io/2021/09/07/UnityShader%E5%9B%BE%E7%89%87%E6%BB%9A%E5%8A%A8%E6%95%88%E6%9E%9C</id><content type="html" xml:base="https://startnight.github.io/2021/09/07/UnityShader%E5%9B%BE%E7%89%87%E6%BB%9A%E5%8A%A8%E6%95%88%E6%9E%9C/"><![CDATA[<h2 id="unity-shader-图片滚动效果">Unity Shader 图片滚动效果</h2>

<h2 id="要透明就效果就不要把图片格式设置成sprite用默认的格式就可以有透明效果"><strong>要透明就效果就不要把图片格式设置成Sprite,用默认的格式就可以有透明效果</strong></h2>

<h2 id="要透明就效果就不要把图片格式设置成sprite用默认的格式就可以有透明效果-1"><strong>要透明就效果就不要把图片格式设置成Sprite,用默认的格式就可以有透明效果</strong></h2>

<h2 id="要透明就效果就不要把图片格式设置成sprite用默认的格式就可以有透明效果-2"><strong>要透明就效果就不要把图片格式设置成Sprite,用默认的格式就可以有透明效果</strong></h2>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'</span>

<span class="n">Shader</span> <span class="s">"UnityShaders/UVAnimation"</span> <span class="p">{</span>
	<span class="n">Properties</span> <span class="p">{</span>
		<span class="nf">_Color</span> <span class="p">(</span><span class="s">"Color Tint"</span><span class="p">,</span> <span class="n">Color</span><span class="p">)</span> <span class="p">=</span> <span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span>
		<span class="nf">_MainTex</span> <span class="p">(</span><span class="s">"Image Sequence"</span><span class="p">,</span> <span class="m">2D</span><span class="p">)</span> <span class="p">=</span> <span class="s">"white"</span> <span class="p">{}</span>

    	<span class="nf">_Speed</span> <span class="p">(</span><span class="s">"Speed"</span><span class="p">,</span> <span class="nf">Range</span><span class="p">(-</span><span class="m">10</span><span class="p">,</span> <span class="m">10</span><span class="p">))</span> <span class="p">=</span> <span class="m">1</span>
	<span class="p">}</span>
	<span class="n">SubShader</span> <span class="p">{</span>
		<span class="n">Tags</span> <span class="p">{</span><span class="s">"Queue"</span><span class="p">=</span><span class="s">"Transparent"</span> <span class="s">"IgnoreProjector"</span><span class="p">=</span><span class="s">"True"</span> <span class="s">"RenderType"</span><span class="p">=</span><span class="s">"Transparent"</span><span class="p">}</span>
		
		<span class="n">Pass</span> <span class="p">{</span>
			<span class="n">Tags</span> <span class="p">{</span> <span class="s">"LightMode"</span><span class="p">=</span><span class="s">"ForwardBase"</span> <span class="p">}</span>
			
			<span class="n">ZWrite</span> <span class="n">Off</span>
			<span class="n">Blend</span> <span class="n">SrcAlpha</span> <span class="n">OneMinusSrcAlpha</span>
			
			<span class="n">CGPROGRAM</span>
			
			<span class="err">#</span><span class="n">pragma</span> <span class="n">vertex</span> <span class="n">vert</span>  
			<span class="err">#</span><span class="n">pragma</span> <span class="n">fragment</span> <span class="n">frag</span>
			
			<span class="err">#</span><span class="n">include</span> <span class="s">"UnityCG.cginc"</span>
			
			<span class="n">fixed4</span> <span class="n">_Color</span><span class="p">;</span>
			<span class="n">sampler2D</span> <span class="n">_MainTex</span><span class="p">;</span>
			<span class="n">float4</span> <span class="n">_MainTex_ST</span><span class="p">;</span>
	
			<span class="kt">float</span> <span class="n">_Speed</span><span class="p">;</span>
			  
			<span class="k">struct</span> <span class="nc">a2v</span> <span class="p">{</span>  
			    <span class="n">float4</span> <span class="n">vertex</span> <span class="p">:</span> <span class="n">POSITION</span><span class="p">;</span> 
			    <span class="n">float2</span> <span class="n">texcoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
			<span class="p">};</span>  
			
			<span class="k">struct</span> <span class="nc">v2f</span> <span class="p">{</span>  
			    <span class="n">float4</span> <span class="n">pos</span> <span class="p">:</span> <span class="n">SV_POSITION</span><span class="p">;</span>
			    <span class="n">float2</span> <span class="n">uv</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
			<span class="p">};</span>  
			
			<span class="n">v2f</span> <span class="nf">vert</span> <span class="p">(</span><span class="n">a2v</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>  
				<span class="n">v2f</span> <span class="n">o</span><span class="p">;</span>  
				<span class="n">o</span><span class="p">.</span><span class="n">pos</span> <span class="p">=</span> <span class="nf">UnityObjectToClipPos</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">vertex</span><span class="p">);</span>  
				<span class="n">o</span><span class="p">.</span><span class="n">uv</span> <span class="p">=</span> <span class="nf">TRANSFORM_TEX</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">texcoord</span><span class="p">,</span> <span class="n">_MainTex</span><span class="p">);</span>  
				<span class="k">return</span> <span class="n">o</span><span class="p">;</span>
			<span class="p">}</span>  
			
			<span class="n">fixed4</span> <span class="nf">frag</span> <span class="p">(</span><span class="n">v2f</span> <span class="n">i</span><span class="p">)</span> <span class="p">:</span> <span class="n">SV_Target</span> <span class="p">{</span>
				
				<span class="n">half2</span> <span class="n">uv</span> <span class="p">=</span> <span class="n">i</span><span class="p">.</span><span class="n">uv</span><span class="p">;</span>
				<span class="n">uv</span><span class="p">.</span><span class="n">x</span> <span class="p">+=</span> <span class="p">(</span><span class="n">_Time</span><span class="p">.</span><span class="n">y</span> <span class="p">*</span> <span class="n">_Speed</span><span class="p">);</span>
				<span class="c1">//uv.y  += time;;</span>
				
				<span class="n">fixed4</span> <span class="n">c</span> <span class="p">=</span> <span class="nf">tex2D</span><span class="p">(</span><span class="n">_MainTex</span><span class="p">,</span> <span class="n">uv</span><span class="p">);</span>
				<span class="n">c</span><span class="p">.</span><span class="n">rgb</span> <span class="p">*=</span> <span class="n">_Color</span><span class="p">;</span>
				
				<span class="k">return</span> <span class="n">c</span><span class="p">;</span>
			<span class="p">}</span>
			
			<span class="n">ENDCG</span>
		<span class="p">}</span>  
	<span class="p">}</span>
	<span class="n">FallBack</span> <span class="s">"Transparent/VertexLit"</span>
<span class="p">}</span>
</code></pre></div></div>

<p><img src="..\images\blog\UnityShaderUVAnimation.gif" alt="image" /></p>]]></content><author><name>康</name></author><category term="Unity3D" /><summary type="html"><![CDATA[在unity中的shader实现图片无限滚动的效果,可以用做引导的箭头.]]></summary></entry><entry><title type="html">Unity不销毁的单例写法</title><link href="https://startnight.github.io/2021/09/07/Unity%E4%B8%8D%E9%94%80%E6%AF%81%E7%9A%84%E5%8D%95%E4%BE%8B/" rel="alternate" type="text/html" title="Unity不销毁的单例写法" /><published>2021-09-07T00:00:00+00:00</published><updated>2021-09-07T00:00:00+00:00</updated><id>https://startnight.github.io/2021/09/07/Unity%E4%B8%8D%E9%94%80%E6%AF%81%E7%9A%84%E5%8D%95%E4%BE%8B</id><content type="html" xml:base="https://startnight.github.io/2021/09/07/Unity%E4%B8%8D%E9%94%80%E6%AF%81%E7%9A%84%E5%8D%95%E4%BE%8B/"><![CDATA[<p><strong>Unity不销毁的单例写法</strong></p>

<pre><code class="language-C#">
    // Use this for initialization
    void Awake()
    {

        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this);
            name = "UserManager";

        }
        else if (this != instance)
        {
            string sceneName = SceneManager.GetActiveScene().name;
            Debug.Log("删除场景" + sceneName + "的" + name);
            Destroy(gameObject);
        }
    }
</code></pre>

<p><img src="..\images\blog\clipboard.png" alt="image" /></p>]]></content><author><name>康</name></author><category term="Unity3D" /><summary type="html"><![CDATA[在unity中的不销毁的单例写法.]]></summary></entry><entry><title type="html">Unity Shader 图片滚动效果</title><link href="https://startnight.github.io/2021/09/07/Unity%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BC%80%E5%A4%B4%E6%B3%A8%E9%87%8A/" rel="alternate" type="text/html" title="Unity Shader 图片滚动效果" /><published>2021-09-07T00:00:00+00:00</published><updated>2021-09-07T00:00:00+00:00</updated><id>https://startnight.github.io/2021/09/07/Unity%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BC%80%E5%A4%B4%E6%B3%A8%E9%87%8A</id><content type="html" xml:base="https://startnight.github.io/2021/09/07/Unity%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BC%80%E5%A4%B4%E6%B3%A8%E9%87%8A/"><![CDATA[<p><strong>Unity如何创建一个开头注释</strong></p>

<p>这个是C#路径 下的Class 给后端的地址 不过一般我们是用unity</p>

<blockquote>
  <p>Microsoft Visual Studio\2017\Professional\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class</p>
</blockquote>

<p>这个是unity</p>

<blockquote>
  <p>Unity\Editor\Data\Resources\ScriptTemplates</p>
</blockquote>

<p>​    <img src="data:image/jpeg;base64,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" alt="0" /></p>

<p>image.png</p>

<p>Mac版本是</p>

<blockquote>
  <p>/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates/81-C#\ Script-NewBehaviourScript.cs.txt</p>
</blockquote>

<p>这个就是我们的模板脚本 还有别的shader脚本</p>

<p>这一段粘贴到最上边</p>

<pre><code class="language-C#">/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   
 *History:
*/
</code></pre>

<p>在Editor文件夹下创建</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">UnityEditor</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span>
<span class="c1">//UnityEditor.AssetModificationProcessor监听Project视图中资源的  创建  删除  移动 保存</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">AddFileHeadComment</span> <span class="p">:</span><span class="n">UnityEditor</span><span class="p">.</span><span class="n">AssetModificationProcessor</span>
<span class="p">{</span>
    <span class="c1">/// &lt;summary&gt;</span>
    <span class="c1">/// asset被创建完，文件生成在磁盘上但没有生成.meta文件和import之前调用</span>
    <span class="c1">/// &lt;/summary&gt;</span>
    <span class="c1">/// &lt;param name="newFileMeta"&gt;是由创建文件的path加上.meta组成的&lt;/param&gt;</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">OnWillCreateAsset</span><span class="p">(</span><span class="kt">string</span> <span class="n">newFileMeta</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">string</span> <span class="n">newPath</span> <span class="p">=</span> <span class="n">newFileMeta</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">".meta"</span><span class="p">,</span> <span class="s">""</span><span class="p">);</span>
        <span class="c1">//获取的是文件后面的.xx的后缀</span>
        <span class="kt">string</span> <span class="n">fileExt</span> <span class="p">=</span> <span class="n">Path</span><span class="p">.</span><span class="nf">GetExtension</span><span class="p">(</span><span class="n">newPath</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">fileExt</span><span class="p">!=</span><span class="s">".cs"</span><span class="p">)</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="c1">//Application.datapath会根据使用平台不同而不同   多了一个Assets替换掉</span>
        <span class="kt">string</span> <span class="n">realPath</span> <span class="p">=</span> <span class="n">Application</span><span class="p">.</span><span class="n">dataPath</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"Assets"</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span> <span class="p">+</span> <span class="n">newPath</span><span class="p">;</span>
        <span class="kt">string</span> <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">File</span><span class="p">.</span><span class="nf">ReadAllText</span><span class="p">(</span><span class="n">realPath</span><span class="p">);</span>

        <span class="c1">//这里实现自定义的一些规则 就是替换注释信息</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#SCRIPTFULLNAME#"</span><span class="p">,</span> <span class="n">Path</span><span class="p">.</span><span class="nf">GetFileName</span><span class="p">(</span><span class="n">newPath</span><span class="p">));</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#COMPANY#"</span><span class="p">,</span> <span class="n">PlayerSettings</span><span class="p">.</span><span class="n">companyName</span><span class="p">);</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#AUTHOR#"</span><span class="p">,</span> <span class="s">"why"</span><span class="p">);</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#VERSION#"</span><span class="p">,</span> <span class="s">"1.0"</span><span class="p">);</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#UNITYVERSION#"</span><span class="p">,</span> <span class="n">Application</span><span class="p">.</span><span class="n">unityVersion</span><span class="p">);</span>
        <span class="n">scriptContent</span> <span class="p">=</span> <span class="n">scriptContent</span><span class="p">.</span><span class="nf">Replace</span><span class="p">(</span><span class="s">"#DATE#"</span><span class="p">,</span> <span class="n">System</span><span class="p">.</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">.</span><span class="nf">ToString</span><span class="p">(</span><span class="s">"yyyy-MM-dd"</span><span class="p">));</span>

        <span class="n">File</span><span class="p">.</span><span class="nf">WriteAllText</span><span class="p">(</span><span class="n">realPath</span><span class="p">,</span> <span class="n">scriptContent</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>这样以后再unity创建脚本就有</p>

<p><img src="..\images\blog\Unity注释.png" alt="image" /></p>]]></content><author><name>康</name></author><category term="Unity3D" /><summary type="html"><![CDATA[在unity中的创建默认脚本注释.]]></summary></entry><entry><title type="html">Unity3D面试题</title><link href="https://startnight.github.io/2021/08/23/Unity3D%E9%9D%A2%E8%AF%95%E9%A2%98/" rel="alternate" type="text/html" title="Unity3D面试题" /><published>2021-08-23T00:00:00+00:00</published><updated>2021-08-23T00:00:00+00:00</updated><id>https://startnight.github.io/2021/08/23/Unity3D%E9%9D%A2%E8%AF%95%E9%A2%98</id><content type="html" xml:base="https://startnight.github.io/2021/08/23/Unity3D%E9%9D%A2%E8%AF%95%E9%A2%98/"><![CDATA[<h2 id="unity3d面试题">Unity3D面试题</h2>

<p><strong>一：什么是协同程序？</strong></p>

<p>在主线程运行的同时开启另一段逻辑处理，来协助当前程序的执行，协程很像多线程，但是不是多线程，Unity的协程实在每帧结束之后去检测yield的条件是否满足。</p>

<p><strong>二：Unity3d中的碰撞器和触发器的区别？</strong></p>

<p>碰撞器是触发器的载体，而<strong>触发器只是碰撞器身上的一个属性</strong>。当<strong>Is Trigger=false</strong>时，碰撞器根据物理引擎引发碰撞，产生碰撞的效果，可以调用<strong>OnCollisionEnter/Stay/Exit</strong>函数；当Is Trigger=true时，碰撞器被物理引擎所忽略，没有碰撞效果，可以调用<strong>OnTriggerEnter/Stay/Exit</strong>函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器.</p>

<p><strong>三：物体发生碰撞的必要条件？</strong></p>

<p>两个物体都必须带有<strong>碰撞器（Collider）</strong>,其中一个物体还必须带有<strong>Rigidbody刚体</strong>，而且必须是运动的物体带有<strong>Rigidbody脚本</strong>才能检测到碰撞。</p>

<p><strong>四：请简述ArrayList和List的主要区别？</strong></p>

<p><strong>ArrayList存在不安全类型</strong>（ArrayList会把所有插入其中的数据都当做Object来处理） 装箱拆箱的操作（费时） List是接口，ArrayList是一个实现了该接口的类，可以被实例化</p>

<p><strong>五：如何安全的在不同工程间安全地迁移asset数据？三种方法</strong></p>

<ul>
  <li>
    <p><strong>1.将Assets目录和Library目录一起迁移</strong></p>
  </li>
  <li>
    <p><strong>2.导出包，export Package</strong></p>
  </li>
  <li>
    <p><strong>3.用unity自带的assets Server功能</strong></p>
  </li>
</ul>

<p><strong>六：OnEnable、Awake、Start运行时的发生顺序？哪些可能在同一个对象周期中反复的发生</strong></p>

<p>Awake –&gt;OnEnable-&gt;Start，OnEnable在同一周期中可以反复地发生。</p>

<p><strong>七：MeshRender中material和sharedmaterial的区别？</strong></p>

<p><strong>修改sharedMaterial将改变所有物体使用这个材质的外观，并且也改变储存在工程里的材质设置</strong>。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质，使用material替代。</p>

<p><strong>八：Unity提供了几种光源，分别是什么</strong></p>

<p><strong>四种。</strong></p>

<p><strong>平行光：Directional Light</strong></p>

<p><strong>点光源：Point Light</strong></p>

<p><strong>聚光灯：Spot Light</strong></p>

<p><strong>区域光源：Area Light</strong></p>

<p><strong>九：简述一下对象池，你觉得在FPS里哪些东西适合使用对象池</strong></p>

<p><strong>对象池就存放需要被反复调用资源的一个空间，当一个对象回大量生成的时候如果每次都销毁创建会很费时间，通过对象池把暂时不用的对象放到一个池中（也就是一个集合），当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象，如果有的话就直接拿出来使用，不需要再创建，如果池中没有可用的对象，才需要重新创建，利用空间换时间来达到游戏的高速运行效果，在FPS游戏中要常被大量复制的对象包括子弹，敌人，粒子等</strong></p>

<p><strong>十：CharacterController和Rigidbody的区别</strong></p>

<p><strong>Rigidbody具有完全真实物理的特性，Unity中物理系统最基本的一个组件，包含了常用的物理特性，而CharacterController可以说是受限的的Rigidbody，具有一定的物理效果但不是完全真实的，是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件</strong></p>

<p><strong>十一：简述prefab的用处</strong></p>

<p><strong>在游戏运行时实例化，prefab相当于一个模板</strong>，对你已经有的素材、脚本、参数做一个默认的配置，以便于以后的修改，同时prefab打包的内容简化了导出的操作，便于团队的交流。</p>

<p><strong>Prefab又被称为预设</strong>，下面部分来自官网：<strong>预置是一种资源类型</strong>——存储在项目视图中的一种可<strong>重复使用的游戏对象</strong>。预置可以多次放入到多个场景中。当你添加一个预置到场景中，就创建了它的一个实例。<strong>所有的预置实例链接到原始预置，基本上是它的克隆</strong>。不管你的项目存在多少实例，当你对预置进行任何更改，你将看到这些更改将应用于所有实例。</p>

<p><strong>十二：请简述sealed关键字用在类声明时与函数声明时的作用</strong></p>

<p><strong>sealed修饰的类为密封类</strong>，类声明时可防止其他类继承此类，在方法中声明则可防止派生类重写此方法。</p>

<p><strong>十三：请简述private，public，protected，internal的区别</strong></p>

<p><strong>public：对任何类和成员都公开，无限制访问</strong></p>

<p><strong>private：仅对该类公开</strong></p>

<p><strong>protected：对该类和其派生类公开</strong></p>

<p><strong>internal：只能在包含该类的程序集中访问该类</strong></p>

<p><strong>十四：使用Unity3d实现2d游戏，有几种方式？</strong></p>

<p><strong>1. 使用本身的GUI，在Unity4.6以后出现的UGUI</strong></p>

<p><strong>2.把摄像机的Projection(投影)值调为Orthographic(正交投影)，不考虑z轴；</strong></p>

<p><strong>3.使用2d插件，如：2DToolKit，和NGUI</strong></p>

<p><strong>十五：在物体发生碰撞的整个过程中，有几个阶段，分别列出对应的函数</strong></p>

<p>三个阶段，1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit</p>

<p><strong>十六：Unity3d的物理引擎中，有几种施加力的方式，分别描述出来</strong></p>

<p><strong>rigidbody.AddForce/AddForceAtPosition</strong>，都在rigidbody系列函数中。大家可以自己去查看一下rigidbody的API</p>

<p><strong>十七：什么叫做链条关节？</strong></p>

<p>Hinge Joint，可以模拟两个物体间用一根链条连接在一起的情况，能保持两个物体在一个固定距离内部相互移动而不产生作用力，但是达到固定距离后就会产生拉力。</p>

<p><strong>十八：物体自身旋转使用的函数？</strong></p>

<p><strong>Transform.Rotate()</strong></p>

<p><strong>十九：Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs)，请列出保存和读取整形数据的函数</strong></p>

<p><strong>PlayerPrefs.SetInt() PlayerPrefs.GetInt()</strong></p>

<p><strong>二十：Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期，请列出系统自带的几个重要的方法。</strong></p>

<p><strong>Awake——&gt;OnEnable–&gt;Start——&gt;Update——&gt;FixedUpdate——&gt;LateUpdate——&gt;OnGUI——&gt;OnDisable——&gt;OnDestroy</strong></p>

<p><strong>二十一：物理更新一般放在哪个系统函数里？</strong></p>

<p><strong>FixedUpdate，每固定帧绘制时执行一次，和Update不同的是FixedUpdate是渲染帧执行，如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算，因为是跟每帧渲染有关。Update就比较适合做控制。</strong></p>

<p><strong>二十二：在场景中放置多个Camera并同时处于活动状态会发生什么？</strong></p>

<p>游戏界面可以看到很多摄像机的混合。</p>

<p><strong>二十三：如何销毁一个UnityEngine.Object及其子类？</strong></p>

<p>使用Destroy()方法;</p>

<p><strong>二十四：请描述为什么Unity3d中会发生在组件上出现数据丢失的情况</strong></p>

<p>一般是组件上绑定的物体对象被删除了</p>

<p><strong>二十五：LOD是什么，优缺点是什么？</strong></p>

<p><strong>LOD(Level of detail)多层次细节，是最常用的游戏优化技术</strong>。它按照模型的位置和重要程度决定物体渲染的资源分配，降低非重要物体的面数和细节度，从而获得高效率的渲染运算。缺点是增加了内存。</p>

<p><strong>二十六：MipMap是什么，作用？</strong></p>

<p><strong>MipMapping：在三维计算机图形的贴图渲染中有常用的技术，为加快渲染进度和减少图像锯齿，贴图被处理成由一系列被预先计算和优化过的图片组成的文件，这样的贴图被称为MipMap。</strong></p>

<p><strong>二十七：请描述Interface与抽象类之间的不同</strong></p>

<p><strong>抽象类表示该类中可能已经有一些方法的具体定义，但接口就是公公只能定义各个方法的界面 ，不能具体的实现代码在成员方法中。类是子类用来继承的，当父类已经有实际功能的方法时该方法在子类中可以不必实现，直接引用父类的方法，子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法，不能遗漏任何一个。</strong></p>

<p><strong>二十八：.Net与Mono的关系？</strong></p>

<p><strong>mono是.net的一个开源跨平台工具，就类似java虚拟机，java本身不是跨平台语言，但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行，mono可以实现跨平台跑，可以运行于linux，Unix，Mac OS等。</strong></p>

<p><strong>二十九：简述Unity3D支持的作为脚本的语言的名称</strong></p>

<p>Unity的脚本语言基于Mono的.Net平台上运行，可以使用.NET库，这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译，他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的，区别主要体现在语言特性上。JavaScript、 C#、Boo</p>

<p><strong>三十：U3D中用于记录节点空间几何信息的组件名称，及其父类名称</strong></p>

<p><strong>Transform 父类是 Component</strong></p>

<p><strong>三十一：向量的点乘、叉乘以及归一化的意义？</strong></p>

<p><strong>1.点乘描述了两个向量的相似程度，结果越大两向量越相似，还可表示投影</strong></p>

<p><strong>2.叉乘得到的向量垂直于原来的两个向量</strong></p>

<p><strong>3.标准化向量：用在只关系方向，不关心大小的时候</strong></p>

<p><strong>三十二：为何大家都在移动设备上寻求U3D原生GUI的替代方案</strong></p>

<p>不美观，OnGUI很耗费时间，效率不高，使用不方便</p>

<p><strong>三十三：请简述如何在不同分辨率下保持UI的一致性</strong></p>

<p><strong>NGUI很好的解决了这一点，屏幕分辨率的自适应性，原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值，然后修改摄像机的size。UGUI通过锚点和中心点和分辨率也解决这个问题</strong></p>

<p><strong>三十四：什么是LightMap？</strong></p>

<p><strong>LightMap:就是指在三维软件里实现打好光，然后渲染把场景各表面的光照输出到贴图上，最后又通过引擎贴到场景上，这样就使物体有了光照的感觉。</strong></p>

<p><strong>三十五：Unity和cocos2d的区别</strong></p>

<p><strong>1. Unity3D支持C#、javascript等，cocos2d-x 支持c++、Html5、Lua等。</strong></p>

<p><strong>2. cocos2d 开源 并且免费</strong></p>

<p><strong>3. Unity3D支持iOS、Android、Flash、Windows、Mac、Wii等平台的游戏开发，cocos2d-x支持iOS、Android、WP等。</strong></p>

<p><strong>三十六：C#和C++的区别？</strong></p>

<p><strong>简单的说：C# 与C++ 比较的话，最重要的特性就是C# 是一种完全面向对象的语言，而C++ 不是，另外C# 是基于IL 中间语言和.NET Framework CLR 的，在可移植性，可维护性和强壮性都比C++ 有很大的改进。C# 的设计目标是用来开发快速稳定可扩展的应用程序，当然也可以通过Interop 和Pinvoke 完成一些底层操作。更详细的区别大家可以</strong><a href="http://bbs.csdn.net/topics/240034498"><strong>参考这里</strong></a></p>

<p><strong>三十七：结构体和类有何区别？</strong></p>

<p><strong>结构体是一种值类型，而类是引用类型。</strong>（值类型、引用类型是根据数据存储的角度来分的）就是值类型用于存储数据的值，引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的，类则通过引用来对实际数据操作</p>

<p><strong>三十八：ref参数和out参数是什么？有什么区别？</strong></p>

<p><strong>ref和out参数的效果一样，都是通过关键字找到定义在主函数里面的变量的内存地址</strong>，并通过方法体内的语法改变它的大小。不同点就是输出参数必须对参数进行初始化。<strong>ref必须初始化，out 参数必须在函数里赋值。ref参数是引用，out参数为输出参数。</strong></p>

<p><strong>三十九：C#的委托是什么？有何用处？</strong></p>

<p><strong>委托类似于一种安全的指针引用，在使用它时是当做类来看待而不是一个方法，相当于对一组方法的列表的引用。用处：使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码，而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同，委托是面向对象，而且是类型安全的。</strong></p>

<p><strong>四十：C#中的排序方式有哪些？</strong></p>

<p><strong>选择排序，冒泡排序，快速排序，插入排序，希尔排序，归并排序</strong></p>

<p><strong>四十一：射线检测碰撞物的原理是？</strong></p>

<p><strong>射线是3D世界中一个点向一个方向发射的一条无终点的线，在发射轨迹中与其他物体发生碰撞时，它将停止发射 。</strong></p>

<p><strong>四十二：Unity中，照相机的Clipping Planes的作用是什么？调整Near、Fare两个值时，应该注意什么？</strong></p>

<p><strong>剪裁平面 。从相机到开始渲染和停止渲染之间的距离。</strong></p>

<p><strong>四十三：如何让已经存在的GameObject在LoadLevel后不被卸载掉？</strong></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">void</span> <span class="nf">Awake</span><span class="p">()</span> 
 <span class="p">{</span>    
 	<span class="nf">DontDestroyOnLoad</span><span class="p">(</span><span class="n">transform</span><span class="p">.</span><span class="n">gameObject</span><span class="p">);</span> 
 <span class="p">}</span>
</code></pre></div></div>

<p>​</p>

<p><strong>四十四：请简述GC（垃圾回收）产生的原因，并描述如何避免？</strong></p>

<p><strong>GC回收堆上的内存</strong></p>

<p><strong>避免：1.减少new产生对象的次数</strong></p>

<p><strong>2.使用公用的对象（静态成员）</strong></p>

<p><strong>3.将String换为StringBuilder</strong></p>

<p><strong>四十五：反射的实现原理？</strong></p>

<p><strong>审查元数据并收集关于它的类型信息的能力。实现原理：在运行时根据程序集及其中的类型得到元数据。下面是实现步骤：</strong></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="m">1.</span> <span class="err">导入</span><span class="k">using</span> <span class="nn">System.Reflection</span><span class="p">;</span>
<span class="m">2.</span> <span class="n">Assembly</span><span class="p">.</span><span class="nf">Load</span><span class="p">(</span><span class="err">“程序集”</span><span class="p">)</span><span class="err">加载程序集</span><span class="p">,</span><span class="err">返回类型是一个</span><span class="n">Assembly</span>
<span class="m">3.</span> <span class="err">得到程序集中所有类的名称</span>
<span class="k">foreach</span> <span class="p">(</span><span class="n">Type</span> <span class="n">type</span> <span class="k">in</span> <span class="n">assembly</span><span class="p">.</span><span class="nf">GetTypes</span><span class="p">())</span> <span class="p">{</span>    <span class="kt">string</span> <span class="n">t</span> <span class="p">=</span> <span class="n">type</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span> <span class="p">}</span>    
<span class="m">4.</span> <span class="n">Type</span> <span class="n">type</span> <span class="p">=</span> <span class="n">assembly</span><span class="p">.</span><span class="nf">GetType</span><span class="p">(</span><span class="err">“程序集</span><span class="p">.</span><span class="err">类名”</span><span class="p">);</span><span class="err">获取当前类的类型</span>
<span class="m">5.</span> <span class="n">Activator</span><span class="p">.</span><span class="nf">CreateInstance</span><span class="p">(</span><span class="n">type</span><span class="p">);</span> <span class="err">创建此类型实例</span>
<span class="m">6.</span> <span class="n">MethodInfo</span> <span class="n">mInfo</span> <span class="p">=</span> <span class="n">type</span><span class="p">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="err">“方法名”</span><span class="p">);</span><span class="err">获取当前方法</span>
<span class="m">7.</span> <span class="n">m</span><span class="p">.</span><span class="n">Info</span><span class="p">.</span><span class="nf">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span><span class="err">方法参数</span><span class="p">);</span>
</code></pre></div></div>

<p><strong>四十六：简述四元数的作用，四元数对欧拉角的优点？</strong></p>

<p><strong>四元数用于表示旋转</strong></p>

<p><strong>相对欧拉角的优点：</strong></p>

<p><strong>1.能进行增量旋转</strong></p>

<p><strong>2.避免万向锁</strong></p>

<p><strong>3.给定方位的表达方式有两种，互为负（欧拉角有无数种表达方式）</strong></p>

<p><strong>四十七：移动相机动作在哪个函数里，为什么在这个函数里？</strong></p>

<p><strong>LateUpdate，是在所有的update结束后才调用，比较适合用于命令脚本的执行。官网上例子是摄像机的跟随，都是所有的update操作完才进行摄像机的跟进，不然就有可能出现摄像机已经推进了，但是视角里还未有角色的空帧出现。</strong></p>

<p><strong>四十八：GPU的工作原理</strong></p>

<p><strong>简而言之，GPU的图形（处理）流水线完成如下的工作：（并不一定是按照如下顺序） 顶点处理：这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系，建立起3D图形的骨架。在支持DX8和DX9规格的GPU中，这些工作由硬件实现的Vertex Shader（定点着色器）完成。 光栅化计算：显示器实际显示的图像是由像素组成的，我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如，一条数学表示的斜线段，最终被转化成阶梯状的连续像素点。 纹理帖图：顶点单元生成的多边形只构成了3D物体的轮廓，而纹理映射（texture mapping）工作完成对多变形表面的帖图，通俗的说，就是将多边形的表面贴上相应的图片，从而生成“真实”的图形。TMU（Texture mapping unit）即是用来完成此项工作。 像素处理：这阶段（在对每个像素进行光栅化处理期间）GPU完成对像素的计算和处理，从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中，这些工作由硬件实现的Pixel Shader（像素着色器）完成。 最终输出：由ROP（光栅化引擎）最终完成像素的输出，1帧渲染完毕后，被送到显存帧缓冲区。</strong></p>

<p><strong>总结：GPU的工作通俗的来说就是完成3D图形的生成，将图形映射到相应的像素点上，对每个像素进行计算确定最终颜色并完成输出。</strong></p>

<p><strong>四十九：什么是渲染管道？</strong></p>

<p>是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤，都要将几何物体从一个坐标系中变换到另一个坐标系中去。主要步骤有：</p>

<p><strong>本地坐标-&gt;视图坐标-&gt;背面裁剪-&gt;光照-&gt;裁剪-&gt;投影-&gt;视图变换-&gt;光栅化</strong></p>

<p><strong>五十：如何优化内存？</strong></p>

<p><strong>有很多种方式，例如</strong></p>

<p><strong>1.压缩自带类库；</strong></p>

<p><strong>2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉；</strong></p>

<p><strong>3.释放AssetBundle占用的资源；</strong></p>

<p><strong>4.降低模型的片面数，降低模型的骨骼数量，降低贴图的大小；</strong></p>

<p><strong>5.使用光照贴图，使用多层次细节(LOD)，使用着色器(Shader)，使用预设(Prefab)。</strong></p>

<p><strong>6.代码中少产生临时变量</strong></p>

<p><strong>五十一：动态加载资源的方式？他们之间的区别</strong></p>

<p><strong>1.Resources.Load();</strong></p>

<p><strong>2.AssetBundle</strong></p>

<p><a href="http://game.ceeger.com/forum/read.php?tid=4394"><strong>区别参考</strong></a></p>

<p><strong>五十二：请描述游戏动画有哪几种，以及其原理？</strong></p>

<p><strong>主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。</strong></p>

<p><strong>关节动画：把角色分成若干独立部分，一个部分对应一个网格模型，部分的动画连接成一个整体的动画，角色比较灵活，Quake2中使用这种动画；</strong></p>

<p><strong>骨骼动画，广泛应用的动画方式，集成了以上两个方式的优点，骨骼按角色特点组成一定的层次结构，有关节相连，可做相对运动，皮肤作为单一网格蒙在骨骼之外，决定角色的外观；</strong></p>

<p><strong>单一网格模型动画由一个完整的网格模型构成，在动画序列的关键帧里记录各个顶点的原位置及其改变量，然后插值运算实现动画效果，角色动画较真实。</strong></p>

<p><strong>五十三：alpha blend工作原理</strong></p>

<p><strong>Alpha Blend 实现透明效果，不过只能针对某块区域进行alpha操作，透明度可设。</strong></p>

<p><strong>五十四：写出光照计算中的diffuse的计算公式</strong></p>

<p><strong>diffuse = Kd x colorLight x max(N*L,0)；Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘，如果结果小于等于0，则漫反射为0。</strong></p>

<p><strong>五十五：两种阴影判断的方法、工作原理。</strong></p>

<p><strong>本影和半影：</strong><a href="http://www.zhihu.com/question/21122056"><strong>参考本影和半影</strong></a></p>

<p><strong>本影：景物表面上那些没有被光源直接照射的区域（全黑的轮廓分明的区域）。</strong></p>

<p><strong>半影：景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域（半明半暗区域）</strong></p>

<p><strong>工作原理：从光源处向物体的所有可见面投射光线，将这些面投影到场景中得到投影面，再将这些投影面与场景中的其他平面求交得出阴影多边形，保存这些阴影多边形信息，然后再按视点位置对场景进行相应处理得到所要求的视图（利用空间换时间，每次只需依据视点位置进行一次阴影计算即可，省去了一次消隐过程）</strong></p>

<p><strong>五十六：Vertex Shader是什么，怎么计算？</strong></p>

<p><strong>顶点着色器是一段执行在GPU上的程序，用来取代fixed pipeline中的transformation和lighting，Vertex Shader主要操作顶点。</strong></p>

<p><strong>Vertex Shader对输入顶点完成了从local space到homogeneous space（齐次空间）的变换过程，homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。</strong></p>

<p><strong>五十七：下列代码在运行中会产生几个临时对象？</strong></p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">string</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">string</span><span class="p">(</span><span class="s">"abc"</span><span class="p">);</span> 
<span class="n">a</span> <span class="p">=</span> <span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="nf">ToUpper</span><span class="p">()</span> <span class="p">+</span> <span class="s">"123"</span><span class="p">).</span><span class="nf">Substring</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>                  

<span class="err">在</span><span class="n">C</span><span class="err">#中第一行是会报错的（</span><span class="n">Java</span><span class="err">中倒是可行）。</span>

<span class="err">应该这样初始化：</span>

<span class="kt">string</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">string</span><span class="p">(</span><span class="k">new</span> <span class="kt">char</span><span class="p">[]{</span><span class="sc">'a'</span><span class="p">,</span><span class="sc">'b'</span><span class="p">,</span><span class="sc">'c'</span><span class="p">});</span>               

<span class="err">答案为：</span><span class="m">5</span><span class="err">个临时对象</span>


</code></pre></div></div>

<p><strong>五十八：下列代码在运行中会发生什么问题？如何避免？</strong></p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">ls</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="k">new</span> <span class="kt">int</span><span class="p">[]</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span> <span class="p">});</span> 
<span class="k">foreach</span> <span class="p">(</span><span class="kt">int</span> <span class="n">item</span> <span class="k">in</span> <span class="n">ls</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">item</span> <span class="p">*</span> <span class="n">item</span><span class="p">);</span>    
    <span class="n">ls</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="n">item</span><span class="p">);</span> 
<span class="p">}</span>
</code></pre></div></div>

<p>​</p>

<p><strong>产生运行时错误，在 ls.Remove(item)这行，因为foreach是只读的。不能一边遍历一边修改。</strong></p>

<p><strong>五十九：Unity3D是否支持写成多线程程序？如果支持的话需要注意什么？</strong></p>

<p><strong>仅能从主线程中访问Unity3D的组件，对象和Unity3D系统调用</strong></p>

<p><strong>支持：如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。</strong></p>

<p><strong>注意：C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象</strong></p>

<p><strong>六十：Unity3D的协程和C#线程之间的区别是什么？</strong></p>

<p><strong>多线程程序同时运行多个线程 ，而在任一指定时刻只有一个协程在运行，并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。</strong></p>

<p><strong>Unity3d没有多线程的概念，不过unity也给我们提供了StartCoroutine（协同程序）和LoadLevelAsync（异步加载关卡）后台加载场景的方法。 StartCoroutine为什么叫协同程序呢，所谓协同，就是当你在StartCoroutine的函数体里处理一段代码时，利用yield语句等待执行结果，这期间不影响主程序的继续执行，可以协同工作。</strong></p>

<p><strong>六十一：矩阵相乘的意义及注意点</strong></p>

<p><strong>用于表示线性变换：旋转、缩放、投影、平移、仿射</strong></p>

<p><strong>注意矩阵的蠕变：误差的积累</strong></p>

<p><strong>六十二：为什么dynamic font在unicode环境下优于static font</strong></p>

<p><strong>Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。</strong></p>

<p><strong>使用动态字体时，Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候，若使用正常纹理，则字体的纹理将非常大。</strong></p>

<p><strong>六十三：当一个细小的高速物体撞向另一个较大的物体时，会出现什么情况？如何避免？</strong></p>

<p><strong>穿透（碰撞检测失败）</strong></p>

<p><strong>六十四：请简述OnBecameVisible及OnBecameInvisible的发生时机，以及这一对回调函数的意义？</strong></p>

<p><strong>当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。</strong></p>

<p><strong>六十五：什么叫动态合批？跟静态合批有什么区别？</strong></p>

<p><strong>如果动态物体共用着相同的材质，那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的，并不需要你进行额外的操作。</strong></p>

<p><strong>区别：动态批处理一切都是自动的，不需要做任何操作，而且物体是可以移动的，但是限制很多。静态批处理：自由度很高，限制很少，缺点可能会占用更多的内存，而且经过静态批处理后的所有物体都不可以再移动了。</strong></p>

<p><a href="http://blog.csdn.net/kaitiren/article/details/45079797"><strong>参考</strong></a></p>

<p><strong>六十六：简述StringBuilder和String的区别？</strong></p>

<p><strong>String是字符串常量。</strong></p>

<p><strong>StringBuffer是字符串变量 ，线程安全。</strong></p>

<p><strong>StringBuilder是字符串变量，线程不安全。</strong></p>

<p><strong>String类型是个不可变的对象，当每次对String进行改变时都需要生成一个新的String对象，然后将指针指向一个新的对象，如果在一个循环里面，不断的改变一个对象，就要不断的生成新的对象，所以效率很低，建议在不断更改String对象的地方不要使用String类型。</strong></p>

<p><strong>StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改，改善了性能。这一点我们平时使用中也许都知道，连接操作频繁的时候，使用StringBuilder对象。</strong></p>

<p><strong>六十七：Unity3D Shader分哪几种，有什么区别？</strong></p>

<p><strong>表面着色器的抽象层次比较高，它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。</strong></p>

<p><strong>顶点片段着色器可以非常灵活地实现需要的效果，但是需要编写更多的代码，并且很难与Unity的渲染管线完美集成。</strong></p>

<p><strong>固定功能管线着色器可以作为前两种着色器的备用选择，当硬件无法运行那些酷炫Shader的时，还可以通过固定功能管线着色器来绘制出一些基本的内容。</strong></p>

<p><strong>六十八：已知strcpy函数的原型是：char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数，实现strcpy函数。2.解释为什么要返回char *</strong></p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">char</span> <span class="p">*</span> <span class="nf">strcpy</span><span class="p">(</span><span class="kt">char</span> <span class="p">*</span> <span class="n">strDest</span><span class="p">,</span><span class="k">const</span> <span class="kt">char</span> <span class="p">*</span> <span class="n">strSrc</span><span class="p">)</span> <span class="p">{</span>    
    <span class="k">if</span> <span class="p">((</span><span class="n">strDest</span><span class="p">==</span><span class="n">NULL</span><span class="p">)||(</span><span class="n">strSrc</span><span class="p">==</span><span class="n">NULL</span><span class="p">))</span>        
    <span class="k">throw</span> <span class="s">"Invalid argument(s)"</span><span class="p">;</span>    
    <span class="kt">char</span> <span class="p">*</span> <span class="n">strDestCopy</span><span class="p">=</span><span class="n">strDest</span><span class="p">;</span>    
    <span class="k">while</span> <span class="p">((*</span><span class="n">strDest</span><span class="p">++=*</span><span class="n">strSrc</span><span class="p">++)!=</span><span class="sc">'\0'</span><span class="p">);</span>    
    <span class="k">return</span> <span class="n">strDestCopy</span><span class="p">;</span> 
<span class="p">}</span>
</code></pre></div></div>

<p>​</p>

<p><strong>六十九：C#中四种访问修饰符是哪些？各有什么区别？</strong></p>

<p><strong>1.属性修饰符 2.存取修饰符 3.类修饰符 4.成员修饰符。</strong></p>

<p><strong>属性修饰符：</strong></p>

<p><strong>Serializable：按值将对象封送到远程服务器。</strong></p>

<p><strong>STATread：是单线程套间的意思，是一种线程模型。</strong></p>

<p><strong>MATAThread：是多线程套间的意思，也是一种线程模型。</strong></p>

<p><strong>存取修饰符：</strong></p>

<p><strong>public：存取不受限制。</strong></p>

<p><strong>private：只有包含该成员的类可以存取。</strong></p>

<p><strong>internal：只有当前工程可以存取。</strong></p>

<p><strong>protected：只有包含该成员的类以及派生类可以存取。</strong></p>

<p><strong>类修饰符：</strong></p>

<p><strong>abstract：抽象类。指示一个类只能作为其它类的基类。</strong></p>

<p><strong>sealed：密封类。指示一个类不能被继承。理所当然，密封类不能同时又是抽象类，因为抽象总是希望被继承的。</strong></p>

<p><strong>成员修饰符：</strong></p>

<p><strong>abstract：指示该方法或属性没有实现。</strong></p>

<p><strong>sealed：密封方法。可以防止在派生类中对该方法的override（重载）。不是类的每个成员方法都可以作为密封方法密封方法，必须对基类的虚方法进行重载，提供具体的实现方法。所以，在方法的声明中，sealed修饰符总是和override修饰符同时使用。</strong></p>

<p><strong>delegate：委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。</strong></p>

<p><strong>const：指定该成员的值只读不允许修改。</strong></p>

<p><strong>event：声明一个事件。</strong></p>

<p><strong>extern：指示方法在外部实现。</strong></p>

<p><strong>override：重写。对由基类继承成员的新实现。</strong></p>

<p><strong>readonly：指示一个域只能在声明时以及相同类的内部被赋值。</strong></p>

<p><strong>static：指示一个成员属于类型本身，而不是属于特定的对象。即在定义后可不经实例化，就可使用。</strong></p>

<p><strong>virtual：指示一个方法或存取器的实现可以在继承类中被覆盖。</strong></p>

<p><strong>new：在派生类中隐藏指定的基类成员，从而实现重写的功能。 若要隐藏继承类的成员，请使用相同名称在派生类中声明该成员，并用 new 修饰符修饰它。</strong></p>

<p><strong>七十：Heap与Stack有何区别？</strong></p>

<p><strong>1.heap是堆，stack是栈。</strong></p>

<p><strong>2.stack的空间由操作系统自动分配和释放，heap的空间是手动申请和释放的，heap常用new关键字来分配。</strong></p>

<p><strong>3.stack空间有限，heap的空间是很大的自由区。</strong></p>

<p><strong>七十一：值类型和引用类型有何区别？</strong></p>

<p><strong>1.值类型的数据存储在内存的栈中；引用类型的数据存储在内存的堆中，而内存单元中只存放堆中对象的地址。</strong></p>

<p><strong>2.值类型存取速度快，引用类型存取速度慢。</strong></p>

<p><strong>3.值类型表示实际数据，引用类型表示指向存储在内存堆中的数据的指针或引用</strong></p>

<p><strong>4.值类型继承自System.ValueType，引用类型继承自System.Object</strong></p>

<p><strong>5.栈的内存分配是自动释放；而堆在.NET中会有GC来释放</strong></p>

<p><strong>6.值类型的变量直接存放实际的数据，而引用类型的变量存放的则是数据的地址，即对象的引用。</strong></p>

<p><strong>七十二：请写出求斐波那契数列任意一位的值得算法</strong></p>

<p><strong>递归实现：</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>　public static int Fib1(int sum) // 定义一个静态的递归函数
　　　　{
　　　　　　if (sum == 1 || sum == 2) //若sum的值等于1或2，则返回1
　　　　　　{
　　　　　　　　return 1;
　　　　　　}
　　　　　　else
　　　　　　{
　　　　　　　　return sum = Fib1(sum - 1) + digui(sum - 2); //若sum的值大于2，则返回（sum-1）和（sum-2）的和
　　　　　　}
　　　　}
</code></pre></div></div>

<p>​</p>

<p><a href="http://www.cnblogs.com/hlxs/archive/2011/07/15/2107389.html"><strong>参看更多实现方法</strong></a></p>

<p><strong>七十三：协同程序的执行代码是什么？有何用处，有何缺点？</strong></p>

<p>作用：<strong>一个协同程序在执行过程中,可以在任意位置使用yield语句</strong>。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。<strong>协同程序在性能上没有更多的开销</strong>。</p>

<p>缺点：<strong>协同程序并非真线程，可能会发生堵塞</strong>。</p>

<p><strong>七十四：什么是里氏代换元则？</strong></p>

<p>里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。通俗点：<strong>就是子类对象可以赋值给基类对象，基类对象不能赋值给子类对象</strong></p>

<p><a href="http://blog.csdn.net/lovelion/article/details/7540445"><strong>参考</strong></a></p>

<p><strong>七十五：Mock和Stub有何区别？</strong></p>

<p><strong>Mock与Stub的区别：Mock:关注行为验证。细粒度的测试，即代码的逻辑，多数情况下用于单元测试。Stub：关注状态验证。粗粒度的测试，在某个依赖系统不存在或者还没实现或者难以测试的情况下使用，例如访问文件系统，数据库连接，远程协议等。</strong></p>

<p><strong>七十六：概述序列化：</strong></p>

<p>序列化简单理解成把对象转换为容易传输的格式的过程。比如，可以序列化一个对象，然后使用HTTP通过Internet在客户端和服务器端之间传输该对象</p>

<p><strong>七十七：堆和栈的区别？</strong></p>

<p>栈通常保存着我们代码执行的步骤，如在代码段1中 AddFive()方法，int pValue变量，int result变量等等。而堆上存放的则多是对象，数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候，每次从最顶部取走一个盒子。栈也是如此，当一个方法（或类型）被调用完成的时候，就从栈顶取走，接着下一个。堆则不然，像是一个仓库，储存着我们使用的各种对象等信息，跟栈不同的是他们被调用完毕不会立即被清理掉。</p>

<p><strong>七十八：概述c#中代理和事件？</strong></p>

<p>代理就是用来定义指向方法的引用。</p>

<p><strong>C＃事件本质就是对消息的封装</strong>，用作对象之间的通信；发送方叫事件发送器，接收方叫事件接收器</p>

<p><strong>七十九：客户端与服务器交互方式有几种？</strong></p>

<p>socket通常也称作”套接字”,实现服务器和客户端之间的物理连接，并进行数据传输，主要有UDP和TCP两个协议。Socket处于网络协议的传输层。</p>

<p>http协议传输的主要有http协议 和基于http协议的Soap协议（web service）,常见的方式是 http 的post 和get 请求，web 服务。</p>

<p><strong>八十：Unity和Android与iOS如何交互？</strong></p>

<p>Unity可以到处Android和iOS的工程，然后通过安卓或者iOS的类去给Unity发消息，调用Unity中的方法</p>

<p><strong>八十一：如何在Unity3D中查看场景的面试，顶点数和Draw Call数？如何降低Draw Call数？</strong></p>

<p><strong>在Game视图右上角点击Stats。降低Draw Call 的技术是Draw Call Batching</strong></p>

<p><strong>这个在5.0以后在window-》Profiler下面，快捷键是cmd + 7（ctl + 7</strong></p>

<p><strong>八十二：请问alpha test在何时使用？能达到什么效果？</strong></p>

<p>Alpha Test ,中文就是透明度测试。简而言之就是V&amp;F shader中最后fragment函数输出的该点颜色值（即上一讲frag的输出half4）的alpha值与固定值进行比较。AlphaTest语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端，要么完全透明，即看不到，要么完全不透明。</p>

<p><strong>八十三：UNITY3d在移动设备上的一些优化资源的方法</strong></p>

<p>1.使用assetbundle，实现资源分离和共享，将内存控制到200m之内，同时也可以实现资源的在线更新</p>

<p>2.顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者，降低顶点数到8万以下，fps稳定到了30帧左右</p>

<p>3.只使用一盏动态光，不是用阴影，不使用光照探头</p>

<p>粒子系统是cpu上的大头</p>

<p>4.剪裁粒子系统</p>

<p>5.合并同时出现的粒子系统</p>

<p>6.自己实现轻量级的粒子系统animator也是一个效率奇差的地方</p>

<p>7.把不需要跟骨骼动画和动作过渡的地方全部使用animation，控制骨骼数量在30根以下</p>

<p>8.animator出视野不更新</p>

<p>9.删除无意义的animator</p>

<p>10.animator的初始化很耗时（粒子上能不能尽量不用animator）</p>

<p>11.除主角外都不要跟骨骼运动apply root motion</p>

<p>12.绝对禁止掉那些不带刚体带包围盒的物体（static collider ）运动</p>

<p>NUGI的代码效率很差，基本上runtime的时候对cpu的贡献和render不相上下</p>

<p>13每帧递归的计算finalalpha改为只有初始化和变动时计算</p>

<p>14去掉法线计算</p>

<p>15不要每帧计算viewsize 和windowsize</p>

<p>16filldrawcall时构建顶点缓存使用array.copy</p>

<p>17.代码剪裁：使用strip level ，使用.net2.0 subset</p>

<p>18.尽量减少smooth group</p>

<p>19.给美术定一个严格的经过科学验证的美术标准，并在U3D里面配以相应的检查工具</p>

<p><strong>八十四：四元数有什么作用？</strong></p>

<p><strong>对旋转角度进行计算时用到四元数</strong></p>

<p><strong>八十五：将Camera组件的ClearFlags选项选成Depth only是什么意思？有何用处？</strong></p>

<p><strong>如果把摄像机的ClearFlags勾选为Deapth Only,那么摄像机就会只渲染看得见的对象，把背景会完全透明，这种情况一般用在两个摄像机以上的场景中</strong></p>

<p><strong>八十六：在编辑场景时将GameObject设置为Static有何作用？</strong></p>

<p><strong>设置游戏对象为Static时，这些部分被静态物体挡住而不可见时，将会剔除（或禁用）网格对象。因此，在你的场景中的所有不会动的物体都应该标记为Static。</strong></p>

<p><strong>八十七：有A和B两组物体，有什么办法能够保证A组物体永远比B组物体先渲染？</strong></p>

<p><strong>把A组物体的渲染对列大于B物体的渲染队列，通过shader里面的渲染队列来渲染</strong></p>

<p><strong>八十八：将图片的TextureType选项分别选为““Texture”和“Sprite”有什么区别</strong></p>

<p><strong>Sprite作为UI精灵使用，Texture作用模型贴图使用。Sprite需要2的整次幂，打包图片省资源</strong></p>

<p><strong>八十九：问一个Terrain，分别贴3张，4张，5张地表贴图，渲染速度有什么区别？为什么？</strong></p>

<p><strong>没有区别，因为不管几张贴图只渲染一次。</strong></p>

<p><strong>九十：什么是DrawCall？DrawCall高了又什么影响？如何降低DrawCall？</strong></p>

<p><strong>Unity中，每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法：</strong></p>

<ol>
  <li>
    <p>Dynamic Batching</p>
  </li>
  <li>
    <p>Static Batching</p>
  </li>
</ol>

<p><strong>3. 高级特性Shader降级为统一的低级特性的Shader。</strong></p>

<p><strong>九十一：实时点光源的优缺点是什么？</strong></p>

<p>可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。</p>

<p><strong>九十二：Unity的Shader中，Blend SrcAlpha OneMinusSrcAlpha这句话是什么意思？</strong></p>

<p>作用就是Alpha混合。公式：最终颜色 = 源颜色 x 源透明值 + 目标颜色 x（1 - 源透明值）</p>

<p><strong>九十三：简述水面倒影的渲染原理</strong></p>

<p>原理就是对水面的贴图纹理进行扰动，以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动，效果细腻，需要的顶点少，速度快</p>

<p><strong>九十四：简述NGUI中Grid和Table的作用？</strong></p>

<p>对Grid和Table下的子物体进行排序和定位</p>

<p><strong>九十五：请简述NGUI中Panel和Anchor的作用</strong></p>

<ol>
  <li>只要提供一个half-pixel偏移量，它可以让一个控件的位置在Windows系统上精确的显示出来（只有这个Anchor的子控件会受到影响）</li>
  <li>如果挂载到一个对象上，那么他可以将这个对象依附到屏幕的角落或者边缘</li>
  <li>UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer</li>
</ol>

<p><strong>九十六：能用foreach遍历访问的对象需要实现_接口或声明____方法的类型</strong></p>

<p>IEnumerable；GetEnumerator</p>]]></content><author><name>康</name></author><category term="Unity3D" /><summary type="html"><![CDATA[Unity3D面试题]]></summary></entry><entry><title type="html">同程游戏面试记录</title><link href="https://startnight.github.io/2021/08/23/%E5%90%8C%E7%A8%8B%E6%B8%B8%E6%88%8F%E9%9D%A2%E8%AF%95%E8%AE%B0%E5%BD%95/" rel="alternate" type="text/html" title="同程游戏面试记录" /><published>2021-08-23T00:00:00+00:00</published><updated>2021-08-23T00:00:00+00:00</updated><id>https://startnight.github.io/2021/08/23/%E5%90%8C%E7%A8%8B%E6%B8%B8%E6%88%8F%E9%9D%A2%E8%AF%95%E8%AE%B0%E5%BD%95</id><content type="html" xml:base="https://startnight.github.io/2021/08/23/%E5%90%8C%E7%A8%8B%E6%B8%B8%E6%88%8F%E9%9D%A2%E8%AF%95%E8%AE%B0%E5%BD%95/"><![CDATA[<h2 id="同程游戏面试记录">同程游戏面试记录</h2>

<p>在Boss上收到同程HR的面试邀请,简单聊了一下,大概情况心里了解了一下,加班少不了,虽说不是996但是肯定也不是965;薪资福利待遇基本能满足我的要求,因为目前还是在职状态,约的晚上6点面试.</p>

<p>时间:20210825-1800</p>

<p>地点:苏州同程大厦</p>

<p>任务:一面技术主程;二面制作人;三面Boss</p>

<p>大概6点10分钟左右到的同程大厦,路上有些事情耽误了,因为之前没有和HR沟通具体的面试地址,就知道在6楼,上6楼后发现大楼分A,B,C,D四个区很大,无奈问了几个办公的人员,后面有联系了HR才知道在D区,正常应该从大厦前台签到上来的,我是进来后面进来的随便找了电梯就上去了,就绕过了前台…..</p>

<p>根据HR的引导成功与HR会面,HR很贴心的看了一下我没有带简历,还问了一下,然后带我到会议室让我等待一会……</p>

<h2 id="一面技术主程">一面:技术主程</h2>

<p>(后面二面和制作人聊的时候知道的)</p>

<p>面试官进来后先简单说了一下他是这次的面试官,叫xxx.</p>

<p>第一个问题就是简单的自己我介绍一下.面试官翻看着我的简历.</p>

<p>这个问题基本上百分之九十的面试都会问,简单的说一下就行,最好在介绍结尾的时候可以代入下一个话题,可以根据职位的需求进行分析,找一下相关的话题做为介绍的结尾,或者进行一个简答的反问.最好和技术相关和职位相关.</p>

<p>我当时介绍就是:我是xxx,今年xx岁,从事Unity开发3年多,目前是在职状态,主要技术栈是U3D,C#.偏前端开发.</p>

<p>然后就是问一些C#基础的技术问题,(技术问题只记得大概)</p>

<p>第一个问题:C#中两大数据类型是什么?</p>

<p>我第一反应是Array,List,堆,队列,字典,图等 发现对不上号,面试官说是2个,我这好几个,然后思考一下试探性的问了.</p>

<ul>
  <li>我:是数组,队列这些吗?</li>
  <li>面试官:不是,我换个说法int是什么类型,string是什么类型?</li>
  <li>我:int是值类型,string是应用类型</li>
  <li>面试官:值类型和引用类型有什么区别</li>
  <li>我:xxxxxxxxx(记不得说的了)</li>
</ul>

<blockquote>
  <p>分析:这里我把数量类型和数据结构记混了
<strong>数据类型:</strong>
C#中数据类型常用的有值类型和引用类型,还有指针类型不常用
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的.
值类型包含 int、char、float、double、bool、byte,所有的整数类型和浮点类型都是
引用类型不包含存储在变量中的实际数据，但它们包含对变量的引用
内置的 引用类型有： 和 string和object、dynamic</p>
</blockquote>

<blockquote>
  <p><strong>数据结构:</strong>
C#中的数据结构有:
Array(数组),ArrayList,List
LinkedList(链表)
Queue(队列)
Stack(栈)
HaskSet:(哈希表)
Dictionary(字典),SortedDictionary(排序字典)</p>
</blockquote>

<p>第二个问题:Array和List有什么区别?</p>
<ul>
  <li>我:Array是在声明是申请固定的长度,后期如果添加新元素超出原来的数值长度是需要申请新的内存,把原来的数组拷贝过去进行扩容,List可以理解成是Array的plus版本内部把这些操作处理好了,可以在内部可以动态的改变数组的长度.(还好我之前看过List的内部结构的文章).</li>
</ul>

<p>第三个问题:堆与栈的区别?(这个问题在之前之前的其他公司的面试中也有遇到过还好我事后整理一下)</p>

<ul>
  <li>我:栈是快消类型,既用既消,在方法中声明的变量都是存放在栈中的;堆中存放的是实体的类型如类的参数/字段等.栈的速度比堆快.</li>
</ul>

<blockquote>
  <p><strong>堆与栈的区别：</strong>
 1.栈内存存储的是局部变量而堆内存存储的是实体；
 2.栈内存的更新速度要快于堆内存，因为局部变量的生命周期很短；
 3.栈内存存放的变量生命周期一旦结束就会被释放，而堆内存存放的实体会被垃圾回收机制不定时的回收。
栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。
堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。</p>

  <p><strong>扩展: 请简述值类型与引用类型的区别</strong>
答：区别：
1.值类型存储在内存栈中，引用类型数据存储在内存堆中，而内存单元中存放的是堆中存放的地址。
2.值类型存取快，引用类型存取慢。
3.值类型表示实际数据，引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的，堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType,引用类型继承自System.Object。</p>
</blockquote>

<p>然后看了看我的简历,根据我的简历又问了几个问题.这里重点说一些,写简历的时候必须要慎重,大部分面试官都会根据简历提问,自己写在简历上的东西必须知道熟悉.我简历上写熟悉设计模式.然后下个提问就来了?</p>

<p>第四个问题:你熟悉哪些设计模式?</p>

<p>还好我把xx设计模式看完了</p>

<ul>
  <li>
    <p>我:单例,工厂,监听,(MD后面就记不得了)我常用的就这些.</p>
  </li>
  <li>
    <p>面试官:你觉得单例有什么好处?</p>
  </li>
  <li>
    <p>我:单例申明全局唯一个变量,可以直接访问,给我感觉就是开发更高效,比如可以在GameManager或者UIManager中使用…..(结合自己做过的项目.谈一谈)</p>
  </li>
  <li>
    <p>面试官:你在什么时候用工厂模式?</p>
  </li>
  <li>
    <p>我:比如在设计敌人的时候有些共同点和不同点,可以通过工厂模式,把一些功能设计成组件的模式在工场内部完成初始化,这些方法不对外部开放.(可以扩展到面相对象的三大原则封装基础多态的角度来谈)</p>
  </li>
</ul>

<p>第五个问题:怎么判读一个链表是否有环</p>

<p>这个我两天还在LeetCode刷到,记不起来了</p>

<p>我思考了一会.</p>

<p>我:这个我前两天还在LeetCode刷到的,突然记不起来了;</p>

<p>面试官:你平时在哪里刷LeetCode</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">hasCycle</span><span class="p">(</span><span class="n">ListNode</span> <span class="n">head</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">head</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="c1">//快慢两个指针</span>
    <span class="n">ListNode</span> <span class="n">slow</span> <span class="p">=</span> <span class="n">head</span><span class="p">;</span>
    <span class="n">ListNode</span> <span class="n">fast</span> <span class="p">=</span> <span class="n">head</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">fast</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">&amp;&amp;</span> <span class="n">fast</span><span class="p">.</span><span class="n">next</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">//慢指针每次走一步</span>
        <span class="n">slow</span> <span class="p">=</span> <span class="n">slow</span><span class="p">.</span><span class="n">next</span><span class="p">;</span>
        <span class="c1">//快指针每次走两步</span>
        <span class="n">fast</span> <span class="p">=</span> <span class="n">fast</span><span class="p">.</span><span class="n">next</span><span class="p">.</span><span class="n">next</span><span class="p">;</span>
        <span class="c1">//如果相遇，说明有环，直接返回true</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">slow</span> <span class="p">==</span> <span class="n">fast</span><span class="p">)</span>
            <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="c1">//否则就是没环</span>
    <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>然后和面试官闲聊了一会LeetCode和算法方面的问题</p>

<p>中间还有问了排序算法,冒泡,快排.插入</p>

<p>我说就知道会一个冒泡排序,冒泡排序比较稳定</p>

<p>然后聊了一下公司项目的情况,简单沟通了一下,就让我等一下.</p>

<blockquote>
  <p><strong>分析:</strong>这次技术面试没有什么难点都是一些底层基础的问题,没有问道Unity3D相关的技术题目,就连链表检测的那个也是算比较基础的.整体不是特别难,后面了解才知道这个面试我的是目前技术主程,也是做Unity3D开发,不过公司最近做的项目都是用CocosCreator开发的.所以引擎方面的问题没有问的太多.</p>
</blockquote>

<h2 id="二面制作人">二面:制作人</h2>
<ul>
  <li>制作人:简单介绍一下自己</li>
  <li>我:xxxxxx</li>
</ul>

<p>制作人看了看项目经验根据我之前做的项目简答聊了聊,看到我项目上有写mqtt问我是什么</p>

<ul>
  <li>我:mqtt是xxxxxxxxx.</li>
</ul>

<p>聊了聊Socket的通讯在网络互连的第几层(七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)</p>

<ul>
  <li>制作人:平时玩什么游戏吗?</li>
  <li>我:英雄联盟,王者荣耀,吃鸡战场,偶尔涉猎一些新奇的小游戏.</li>
  <li>制作人:你还有什么要问的吗</li>
  <li>我:xxxxxxxxxxx(这个问题真很考验被面试者,通过你问的可以看出来你关心什么,每次被问到这个问题,我到头大</li>
</ul>

<p>)</p>

<ul>
  <li>
    <p>制作人:你以后职业规划是什么?</p>
  </li>
  <li>
    <p>我:偏重视前端,以后发展想朝TA方面发展.</p>
  </li>
</ul>

<p>制作人说了说目前在做的项目和以后要做的项目,等等.
后面就是让我等一会</p>

<blockquote>
  <p><strong>分析:</strong>制作人主要聊的是过去做的项目的和个人的成长规划,入职是否稳定.能否接受加班和对后期项目的接受程度.</p>
</blockquote>

<h2 id="三面boss">三面:Boss</h2>

<p>Boss现在不在,改天在约个时间吧.</p>

<p><strong>20210830更新</strong></p>

<p>隔了一天后收到HR的通知,约的周五晚上面试和Boss,简单和HR聊了一下Boss是发行人主要聊一些过往情况,未来发展等.</p>

<ul>
  <li>
    <p>Boss:简单介绍一下自己.</p>
  </li>
  <li>
    <p>我:XXXXXXX</p>
  </li>
  <li>
    <p>Boss:说一下过去几家公司的经历.</p>
  </li>
  <li>我:XXXXXXX</li>
  <li>
    <p>Boss:说一下每次离职的原因.</p>
  </li>
  <li>
    <p>我:XXXXXXX</p>
  </li>
  <li>
    <p>Boss:你觉得那家公司对你的帮助最大.</p>
  </li>
  <li>
    <p>我:XXXXXXXX</p>
  </li>
  <li>
    <p>Boss:你为什么要加入我们公司.</p>
  </li>
  <li>
    <p>我:XXXXXXX</p>
  </li>
  <li>
    <p>Boss:你觉得你的优点是什么</p>
  </li>
  <li>
    <p>我:XXXXXX(自我感觉当时回答的不好,应该说一下和工作和技术相关.)</p>
  </li>
  <li>
    <p>Boss:你觉得你的缺点是什么</p>
  </li>
  <li>
    <p>我:XXXXXX(自我感觉当时没有回答好)</p>
  </li>
  <li>Boss:你未来的发展规划是什么样的</li>
  <li>我:XXXXXX</li>
</ul>

<blockquote>
  <p><strong>分析:</strong>这次整体的感觉回答的不好.首先在和HR沟通之后知道Boss会聊一下过往经历和未来规划,自己也没有</p>

  <p>做这方面的准备.其次这个算是比较正式的和我第一次和Boss面试.(之前的其他面试,基本上前面的技术过了,就是发offer了).这次的这个Boss面,询问的问题基本是围绕个人经历和职业规划这块的.有些问题也也问的比深入和直接,比如每次离职的原因是什么.基本上每个方向的问题都问的比较彻底.等消息吧!最后一面感觉有点悬.</p>
</blockquote>

<p>——————————————————————END————————————————————</p>]]></content><author><name>康</name></author><category term="Unity3D" /><summary type="html"><![CDATA[苏州同程游戏U3D面试记录]]></summary></entry><entry><title type="html">Welcome</title><link href="https://startnight.github.io/2021/07/15/welcome/" rel="alternate" type="text/html" title="Welcome" /><published>2021-07-15T00:00:00+00:00</published><updated>2021-07-15T00:00:00+00:00</updated><id>https://startnight.github.io/2021/07/15/welcome</id><content type="html" xml:base="https://startnight.github.io/2021/07/15/welcome/"><![CDATA[<h2 id="欢迎第一次使用">欢迎第一次使用</h2>]]></content><author><name>康</name></author><category term="Blog" /><summary type="html"><![CDATA[第一次创建Blog]]></summary></entry></feed>