《UnityAPI.Camera攝像機》
版本 |
作者 |
參與者 |
完成日期 |
備註 |
UnityAPI_Camera_V01_1.0 |
嚴立鑽 |
|
2020.05.15 |
|
|
|
|
|
|
#《UnityAPI.Camera攝像機》發佈說明:
++++“UnityAPI.Camera攝像機”是對UnityAPI中Camera類的剖析和拓展;
立鑽哥哥:Unity是一個入門快、提高難的遊戲引擎,想要提升能力,至少需要越過3道坎:API+Shader+綜合能力;++1、API的積累:對API的合理利用不僅可以減輕自己的編碼負擔,而且往往可以提高程序的運行效率;這也是鑽哥開始“Unity API”獨立打造分類的初衷; ++2、Shader編程:想要做出一款精品遊戲往往需要有高效的Shader的支持;Unity提供了一套改良的“Shader Lab”系統,優化了繁雜的“Open GL”編程; ++3、綜合能力(技術+業務+管理):一款產品的製作除了功能編程外,往往會涉及很多其他領域,例如產品架構、UI交互設計、模型製作等,作爲主要的編程人員,對其他相關領域的瞭解程序往往會影響到產品製作直至最後的產品體驗; ++++立鑽哥哥一直在推動【VR雲遊戲=Unity+SteamVR+雲技術+5G+AI】,這個只是一個引子,拋磚引玉讓大家對整個知識體系有一個明確的落地方向,寶寶們可以根據自己的興趣方向進行拓展:比如Unity這裏是指一種“3D遊戲引擎”,也可拓展至“UE4、Cocos2dx”等遊戲引擎;SteamVR是一種跨硬件解決方案,也可拓展至“VRTK”等第三方插件;“雲技術+5G”是一種跨平臺解決方案的核心技術,同樣可拓展至其他平臺解決方案;AI也是一種先進技術的舉例,也可以拓展至任何一種前沿技術; |
@@提示:有些博客可能只是開了頭,如果感興趣的同學,可以“點贊”或“評論區留言”,只要關注的同學多了,那就會繼續完善喲!(“++==”,表示沒有寫完的,如果關注度不高就不完善了;“++ok++”,表示此篇博客已經完成,是階段性完整的!)
$$$$博客溯源:
++++VR雲遊戲=Unity+SteamVR+雲技術+5G+AI;(說明:AI人工智能不是我們的主要研究技術,只是瞭解一下,領略一下有風的感覺!但是,VR是我們的研究重點)
++++【Unity開發基礎】分類:https://blog.csdn.net/vrunsoftyanlz/category_7309057.html
++++【Linux系統編程】分類:https://blog.csdn.net/vrunsoftyanlz/category_9694767.html
++++【C++C鑄就生存利器】分類:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分類:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立鑽哥哥CSDN空間】:https://blog.csdn.net/VRunSoftYanlz/
#Camera攝像機
#Camera攝像機 |
#Camera攝像機++A1、Description描述++B2、Variables變量++C3、Public Function共有函數++D4、Message消息 |
#A1、Description描述
#A1、Description描述 |
++A1、Description描述
++++立鑽哥哥:Camera(攝像機)是一個設備,玩家通過它看世界;
++++屏幕空間點(Screen Space Point)用像素定義,屏幕的左下爲(0,0);右上是(PixelWidth, pixelHeight);Z的位置是以世界單位衡量的到相機的距離;
++++視口空間點(Viewport Space Point)是規範的並相對於相機的;相機的左下爲(0,0),右上是(1,1);Z的位置是以世界爲單位衡量的到相機的距離;
++++世界空間點(World Space Point)是以全局座標定義的(例如:Transform.position);
#B2、Static Variables靜態變量
#B2、Static Variables靜態變量 |
++B2、Static Variables靜態變量++++B2.1、allCameras++++B2.2、allCamerasCount++++B2.3、current++++B2.4、main++++B2.5、YanlzAPI.Camera.StaticVariables |
++B2.1、allCameras
++B2.1、allCameras |
++B2.1、allCameras
++++立鑽哥哥:所有攝像機;
static Camera[] allCameras; |
++++返回場景中所有啓用的相機;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public int camCount = Camera.allCameras.Length;
void MyTestFunc(){ Debug.Log(“立鑽哥哥:We’ve got: ” + camCount + “ cameras!”); }
} //立鑽哥哥:public class YanlzCamera{} |
++B2.2、allCamerasCount
++B2.2、allCamerasCount |
++B2.2、allCamerasCount
++++立鑽哥哥:所有攝像機數量;
static int allCamerasCount; |
++++當前場景中攝像機數量;
++++返回Camera.allCameras數組的長度即場景中所有攝像機的數量;
++B2.3、current
++B2.3、current |
++B2.3、current
++++立鑽哥哥:當前攝像機;
static Camera current; |
++++當前用於渲染的攝像機,只用於低級的渲染控制(只讀);
++++多數時候會使用Camera.main,只有在執行以下事件的時候使用這個函數:MonoBehaviour.OnRenderImage, MonoBehaviour.OnPreRender, MonoBehaviour.OnPostRender;
++B2.4、main
++B2.4、main |
++B2.4、main
++++立鑽哥哥:主攝像機;
static Camera main; |
++++第一個啓用的被標記爲“MainCamera”的攝像機(只讀);
++++如果場景中沒有攝像機返回null;
#C3、Variables變量
#C3、Variables變量 |
++C3、Variables變量++++C3.1、actualRenderingPath++++C3.2、aspect++++C3.3、backgroundColor++++C3.4、cameraToWorldMatrix++++C3.5、clearFlags++++C3.6、cullingMask++++C3.7、depth++++C3.8、depthTextureMode++++C3.9、eventMask++++C3.10、farClipPlane++++C3.11、fieldOfView++++C3.12、hdr++++C3.13、layerCullDistances++++C3.14、layerCullSpherical++++C3.15、nearClipPlane++++C3.16、orthographic++++C3.17、orthographicSize++++C3.18、pixelHeight++++C3.19、pixelRect++++C3.20、pixelWidth++++C3.21、projectionMatrix++++C3.22、rect++++C3.23、renderingPath++++C3.24、stereoConvergence++++C3.25、stereoEnabled++++C3.26、stereoSeparation++++C3.27、targetTexture++++C3.28、transparencySortMode++++C3.29、useOcclusionCulling++++C3.30、velocity++++C3.31、worldToCameraMatrix++++C3.32、YanlzAPI.Camera.Variables |
++C3.1、actualRenderingPath
++C3.1、actualRenderingPath |
++C3.1、actualRenderingPath
++++立鑽哥哥:實際渲染路徑;
RenderingPath actualRenderingPath; |
++++實際使用的渲染路徑(只讀);
++C3.2、aspect
++C3.2、aspect |
++C3.2、aspect
++++立鑽哥哥:長寬比;
float aspect; |
++++長寬比(寬度除以高度);
++++默認的長寬比是從屏幕的長寬比計算得到的,即使攝像機沒有被渲染到全屏;如果修改了攝像機的aspect比,這個值會一直保持到調用camera.ResetAspect(),這將重置長寬比爲屏幕的長寬比;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ if(camera.aspect > 1.0F){ Debug.Log(“立鑽哥哥:Screen is more wide than tall!”); }else{ Debug.Log(“立鑽哥哥:Screen is more tall than wide!”); } } //立鑽哥哥:void MyTestFunc(){} } //立鑽哥哥:public class YanlzCamera{} |
++C3.3、backgroundColor
++C3.3、backgroundColor |
++C3.3、backgroundColor
++++立鑽哥哥:背景顏色;
Color backgroundColor; |
++++屏幕將被清理爲這個顏色;
++++只在clearFlags被設置爲CameraClearFlags.SolidColor(或者設置爲CameraClearFlags.Skybox但是沒有設置天空盒);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Color color1 = Color.red; public Color color2 = Color.blue; public float duration = 3.0F;
void Update(){ float t = Mathf.PingPong(Time.time, duration) / duration; camera.backgroundColor = Color.Lerp(color1, color2, t); }
void MyTestFunc(){ camera.clearFlags = CameraClearFlags.SolidColor; }
} //立鑽哥哥:public class YanlzCamera{} |
++C3.4、cameraToWorldMatrix
++C3.4、cameraToWorldMatrix |
++C3.4、cameraToWorldMatrix
++++立鑽哥哥:攝像機轉世界矩陣;
Matrix4x4 cameraToWorldMatrix; |
++++從攝像機空間到世界空間的變換矩陣(只讀);
++++使用這個來計算攝像機空間中的一個點在世界座標中的什麼位置上;
++++注意:攝像機空間與OpenGL的約定:攝像機的前面爲Z軸負方向;這不同於Unity的約定,向前爲Z軸正向;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public float distance = -1.0F;
void OnDrawGizmosSelected(){ Matrix4x4 m = camera.cameraToWorldMatrix; Vector3 p = m.MultiplyPoint(new Vector3(0, 0, distance)); Gizmos.color = Color.yellow; Gizmos.DrawSphere(p, 0.2F); } //立鑽哥哥:void OnDrawGizmosSelected(){}
} //立鑽哥哥:public class YanlzCamera{} |
++C3.5、clearFlags
++C3.5、clearFlags |
++C3.5、clearFlags
++++立鑽哥哥:清除標識(可理解爲背景填充);
CameraClearFlags clearFlags; |
++++攝像機如何清除背景;
++++CameraClearFlags.SolidColor(用單色填充背景),CameraClearFlags.Depth(背景透明),CameraClearFlags.Nothing(覆蓋);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.clearFlags = CameraClearFlags.SolidColor; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.6、cullingMask
++C3.6、cullingMask |
++C3.6、cullingMask
++++立鑽哥哥:消隱遮罩;
int cullingMask; |
++++這個用來選擇性的渲染部分場景;
++++如果GameObject的layerMask與相機的cullingMask進行cullingMask操作後爲0,那麼這個遊戲物體對於該攝像機是不可見的;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public void Awake(){ camera.cullingMask = 1 << 0; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.7、depth
++C3.7、depth |
++C3.7、depth
++++立鑽哥哥:深度;
float depth; |
++++攝像機在渲染順序上的深度;
++++具有較低深度的攝像機將在較高深度的攝像機之前渲染;
++++如果有多個攝像機並且其中一些不需要覆蓋整個屏幕,可以使用這個來控制攝像機的繪製次序;
++++經驗總結:場景中的攝像機都會被渲染,由深度0開始依次遞增渲染,且攝像機視口畫面會依次疊加覆蓋,運行後看到的是最後一個攝像機的渲染圖;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.depth = Camera.man.depth + 1; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.8、depthTextureMode
++C3.8、depthTextureMode |
++C3.8、depthTextureMode
++++立鑽哥哥:深度紋理模式;
DepthTextureMode depthTextureMode; |
++++攝像機生成怎樣的一個深度紋理;
++++攝像機可以建立一個屏幕空間深度紋理;這個主要用於圖像後臺處理效果;注意:生成紋理導致性能的花費;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public void Awake(){ camera.depthTextureMode = DepthTextureMode.DepthNormals; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.9、eventMask
++C3.9、eventMask |
++C3.9、eventMask
++++立鑽哥哥:事件遮擋;
int eventMask; |
++++遮擋相機的觸發事件圖層;
++++正如cullingMask確定攝像機是否能夠看到遊戲對象,事件遮擋決定遊戲物體是否能夠接受鼠標事件;只有攝像機可見的對象,並且該對象遮擋層與攝像機的eventMask重疊,能夠接受onMouseXXX事件;如果不使用OnMouseXXX事件,建議將此遮擋設置爲零將會提高性能;
++C3.10、farClipPlane
++C3.10、farClipPlane |
++C3.10、farClipPlane
++++立鑽哥哥:遠裁剪平面;
float farClipPlane; |
++++遠裁剪面的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.farClipPlane = 100.0F; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.11、fieldOfView
++C3.11、fieldOfView |
++C3.11、fieldOfView
++++立鑽哥哥:視野;
float fieldOfView; |
++++攝像機的視野,以度爲單位;
++++這是垂直視野:水平FOV取決於視口的高度比,當攝像機是正交時fieldOfView被忽略;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public void Awake(){ camera.fieldOfView = 60; } } //立鑽哥哥:public class YanlzCamera{}
|
//立鑽哥哥:使用主相機的例子 using UnityEngine; using System.Collections;
public class YanlzMinCamera : MonoBehaviour{ void MyTestFunc(){ Camera.main.filedOfView = 80; } } //立鑽哥哥:public class YanlzMainCamera{} |
++C3.12、hdr
++C3.12、hdr |
++C3.12、hdr
++++立鑽哥哥:高動態範圍;
bool hdr; |
++++高動態範圍渲染;
++++攝像機應該使用高動態範圍渲染嗎?
++C3.13、layerCullDistances
++C3.13、layerCullDistances |
++C3.11、fieldOfView
++++立鑽哥哥:視野;
float fieldOfView; |
++++攝像機的視野,以度爲單位;
++++這是垂直視野:水平FOV取決於視口的高度比,當攝像機是正交時fieldOfView被忽略;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public void Awake(){ camera.fieldOfView = 60; } } //立鑽哥哥:public class YanlzCamera{}
|
//立鑽哥哥:使用主相機的例子 using UnityEngine; using System.Collections;
public class YanlzMinCamera : MonoBehaviour{ void MyTestFunc(){ Camera.main.filedOfView = 80; } } //立鑽哥哥:public class YanlzMainCamera{} |
++C3.12、hdr
++C3.12、hdr |
++C3.12、hdr
++++立鑽哥哥:高動態範圍;
bool hdr; |
++++高動態範圍渲染;
++++攝像機應該使用高動態範圍渲染嗎?
++C3.13、layerCullDistances
++C3.13、layerCullDistances |
++C3.13、layerCullDistances
++++立鑽哥哥:層消隱距離;
float[] layerCullDistances; |
++++每層的消隱距離;
++++通常攝像機跳過渲染對象是遠於farClipPlane,可以使用layerCullDistances設置某些層使用較小消隱距離,如果把它們放到合適的層級,這對於早期剔除一些小的物體對象是非常有用的;
++++當分配layerCullDistances,需要指定的float數組有32個值;0值的消隱距離是使用遠剪裁屏幕距離;
++++默認情況下,每層的消隱將會使用一個平面與攝像機對齊;改變這個領域可設置攝像機上的layercullspherical;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void Start(){ float[] distances = new float[32]; distances[10] = 15; camera.layerCullDistances = distances; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.14、layerCullSpherical
++C3.14、layerCullSpherical |
++C3.14、layerCullSpherical
++++立鑽哥哥:球面層消隱;
bool layerCullSpherical; |
++++攝像機如何執行每層的消隱;
++++通常這種類型的消隱是通過移動攝像機的遠平面接近眼睛執行;通過將該值設置爲true,基於球面距離消隱;好處是:在原地旋轉不影響可見對象;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.layerCullSpherical = true; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.15、nearClipPlane
++C3.15、nearClipPlane |
++C3.15、nearClipPlane
++++立鑽哥哥:近裁剪平面;
float nearClipPlane; |
++++近裁剪面的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.nearClipPlane = 0.1F; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.16、orthographic
++C3.16、orthographic |
++C3.16、orthographic
++++立鑽哥哥:正交;
bool orthographic; |
++++攝像機是正交的(true),是透視的(false)?
++++如果爲true,攝像機的視野由orthographicSize定義;如果爲flase,攝像機的視野由fieldOfView定義;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.orthographic = true; } } //立鑽哥哥:public class YanlzCamera{}
|
//立鑽哥哥:主攝像機應用 using UnityEngine; using System.Collections;
public class YanlzMainCamera : MonoBehaviour{ void MyTestFunc(){ Camera.main.orthographic = true; } } //立鑽哥哥:public class YanlzMainCamera{} |
++C3.17、orthographicSize
++C3.17、orthographicSize |
++C3.17、orthographicSize
++++立鑽哥哥:正交大小;
float orthographicSize; |
++++正交大小;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.orthographic = true; camera.orthographicSize = 5; } } //立鑽哥哥:public class YanlzCamera{}
|
//立鑽哥哥:主攝像機 using UnityEngine; using System.Collections;
public class YanlzMainCamera : MonoBehaviour{ void MyTestFunc(){ Camera.main.orthographic = true; Camera.main.orthographicSize = 5; } } //立鑽哥哥:public class YanlzCamera{} |
++C3.18、pixelHeight
++C3.18、pixelHeight |
++C3.18、pixelHeight
++++立鑽哥哥:攝像機高度;
float pixelHeight; |
++++攝像機有多高,以像素單位(只讀);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ Debug.Log(“立鑽哥哥:Camera is ” + camera.pixelHeight + “ pixels high!”); } } //立鑽哥哥:public class YanlzCamera{} |
++C3.19、pixelRect
++C3.19、pixelRect |
++C3.19、pixelRect
++++立鑽哥哥:像素矩形;
Rect pixelRect; |
++++攝像機被渲染到屏幕像素中的位置;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void Update(){ Rect r = camera.pixelRect; Debug.Log(“立鑽哥哥:Camera display from ” + r.xMin + “ to ” + r.xMax + “ pixel.”); } } //立鑽哥哥:public class YanlzCamera{} |
++C3.20、pixelWidth
++C3.20、pixelWidth |
++C3.20、pixelWidth
++++立鑽哥哥:攝像機寬度;
float pixelWidth; |
++++攝像機有多寬,以像素單位(只讀);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ Debug.Log(“立鑽哥哥:Camera is ” + camera.pixelWidth + “ pixels wide.”); } } //立鑽哥哥:public class YanlzCamera{} |
++C3.21、projectionMatrix
++C3.21、projectionMatrix |
++C3.21、projectionMatrix
++++立鑽哥哥:投影矩陣;
Matrix4x4 projectionMatrix; |
++++設置自定義的投影矩陣;
++++如果改變這個矩陣,攝像機的渲染不再基於它的fieldOfView更新,直到調用ResetProjectionMatrix;
++++只有當真正需要一個非標準的投影時,才使用自定義投影;這個屬性被Unity的水渲染使用來設置一個[oblique projection]矩陣;使用自定義投影需要了解變換和投影矩陣;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Matrix4x4 originalProjection;
void Update(){ Matrix4x4 p = originalProjection; p.m01 += Mathf.Sin(Time.time * 1.2F) * 0.1F; p.m10 += Mathf.Sin(Time.time * 1.5F) * 0.1F; camera.projectionMatrix = p; } //立鑽哥哥:void Update(){}
void MyTestFunc(){ originalProjection = camera.projectionMatrix; }
} //立鑽哥哥:public class YanlzCamera{}
|
using UnityEngine; using System.Collections;
[ExecuteInEditMode] public class YanlzCamera : MonoBehaviour{ public float left = -0.2F; public float right = 0.2F; public float top = 0.2F; public float bottom = -0.2F;
void LeteUpdate(){ Camera cam = camera; Matrix4x4 m = MyPerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane); cam.projectionMatrix = m; }
static Matrix4x4 MyPerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far){ float x = 2.0F * near / (right - left); float y = 2.0F * near / (top - bottom); float a = (right + left) / (right - left); float b = (top + bottom) / (top - bottom); float c = -(far + near) / (far - near); float d = -(2.0F * far * near) / (far - near); float e = -1.0F;
Matrix4x4 m = new Matrix4x4(); m[0, 0] = x; m[0, 1] = 0; m[0, 2] = a; m[0, 3] = 0; m[1, 0] = 0; m[1, 1] = y; m[1, 2] = b; m[1, 3] = 0; m[2, 0] = 0; m[2, 1] = 0; m[2, 2] = c; m[2, 3] = d; m[3, 0] = 0; m[3, 1] = 0; m[3, 2] = e; m[3, 3] = 0;
return m; } //立鑽哥哥:static Matrix4x4 MyPerspectiveOffCenter(){}
} //立鑽哥哥:public class YanlzCamera{} |
++C3.22、rect
++C3.22、rect |
++C3.22、rect
++++立鑽哥哥:矩形;
Rect rect; |
++++相繼被渲染到屏幕規範化座標中的位置;
++++Rect的範圍總是0(左/下)到1(右/上);
//立鑽哥哥:Change the width of the viewport each time space key is pressed function Update(){ if(Input.GetButtonDown(“Jump”)){ //choose the margin randomly var margin = RandomRange(0.0, 0.3);
//setup the rectangle camera.rect = Rect(margin, 0, 1, -margin * 2, 1); } } //立鑽哥哥:function Update(){} |
++C3.23、renderingPath
++C3.23、renderingPath |
++C3.23、renderingPath
++++立鑽哥哥:渲染路徑;
RenderingPath renderingPath; |
++++渲染路徑;
++C3.24、stereoConvergence
++C3.24、stereoConvergence |
++C3.24、stereoConvergence
++++立鑽哥哥:立體聚焦;
float stereoConvergence; |
++++虛擬視點相交點間距;
++C3.25、stereoEnabled
++C3.25、stereoEnabled |
++C3.25、stereoEnabled
++++立鑽哥哥:開啓立體;
bool stereoEnabled; |
++++立體渲染;
++++該攝像機的渲染是否是從虛擬視點作爲一個立體輸出的攝像機;
++C3.26、stereoSeparation
++C3.26、stereoSeparation |
++C3.26、stereoSeparation
++++立鑽哥哥:立體分離;
float stereoSeparation; |
++++虛擬眼間距離;
++C3.27、targetTexture
++C3.27、targetTexture |
++C3.27、targetTexture
++++立鑽哥哥:目標紋理;
RenderTexture targetTexture; |
++++描述渲染紋理(僅Unity專業版);
++++在Unity專業版,可以創建一個渲染紋理應用給攝像機,然後攝像機視圖渲染到RenderTexture,可以保存爲PNG或使用它作爲一個雷達,或簡單顯示場景縮略圖在GUI中;
++C3.28、transparencySortMode
++C3.28、transparencySortMode |
++C3.28、transparencySortMode
++++立鑽哥哥:透明物體排序模式;
TransparencySortMode transparencySortMode; |
++++透明物體的排序模式;
++++默認情況下,透明攝像機排序對象是基於從攝像機的位置到對象中心的距離;和正交攝像機排序是基於沿視線方向的距離;
++++如果使用透視攝像機制作2D遊戲,會使用TransparencySortMode.Orthographic排序模式以便對象是基於相機的視線排序;
++C3.29、useOcclusionCulling
++C3.29、useOcclusionCulling |
++C3.29、useOcclusionCulling
++++立鑽哥哥:使用遮擋剔除;
bool useOcclusionCulling; |
++++無論是否在渲染過程中攝像機都會使用遮擋剔除;
++C3.30、velocity
++C3.30、velocity |
++C3.30、velocity
++++立鑽哥哥:速度;
Vector3 velocity; |
++++獲取世界空間中攝像機的速度(只讀);
++++該攝像機是自上一幀以秒爲單位的運動;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void Update(){ Debug.Log(“立鑽哥哥:Camera moving at ” + camera.velocity.magnitude + “ m/s.”); } } //立鑽哥哥:public class YanlzCamera{} |
++C3.31、worldToCameraMatrix
++C3.31、worldToCameraMatrix |
++C3.31、worldToCameraMatrix
++++立鑽哥哥:世界轉攝像機矩陣;
Matrix4x4 worldToCameraMatrix; |
++++從世界到攝像機空間的變換矩陣;
++++用這個計算物體的攝像機空間位置或提供自定義的位置,這個位置不是基於變換的;
++++注意:攝像機空間和OpenGL的約定相匹配,攝像機的前面爲Z軸負方向,這不同於Unity的約定,向前爲Z軸正向;
++++如果改變這個矩陣,攝像機的渲染不再基於它的Transform更新,直到調用ResetWorldToCameraMatrix;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Vector3 offset = new Vector3(0, 1, 0);
void LateUpdate(){ Vector3 camOffset = new Vector3(-offset.x, -offset.y, offset.z); Matrix4x4 m = Matrix4x4.TRS(camOffset, Quaternion.identity, new Vector3(1, 1, -1));
camera.worldToCameraMatrix = m * transform.worldToLocalMatrix; } //立鑽哥哥:void LateUpdate(){}
} //立鑽哥哥:public class YanlzCamera{} |
#D4、Functions函數
#D4、Functions函數 |
++D4、Function函數++++D4.1、CalculateObliqueMatrix++++D4.2、CopyFrom++++D4.3、Render++++D4.4、RenderToCubemap++++D4.5、RenderWithShader++++D4.6、ResetAspect++++D4.7、ResetProjectionMatrix++++D4.8、RestReplacementShader++++D4.9、RestWorldToCameraMatrix++++D4.10、ScreenPointToRay++++D4.11、ScreenToViewportPoint++++D4.12、ScreenToWorldPoint++++D4.13、SetReplacementShader++++D4.14、setTargetBuffers++++D4.15、ViewportPointToRay++++D4.16、ViewPortToScreenPoint++++D4.17、ViewportToWorldPoint++++D4.18、WorldToScreenPoint++++D4.19、WorldToViewportPoint++++D4.20、YanlzAPI.Camera.Functions |
++D4.1、CalculateObliqueMatrix
++D4.1、CalculateObliqueMatrix |
++D4.1、CalculateObliqueMatrix
++++立鑽哥哥:計算傾斜矩陣;
Matrix4x4 CalculateObliqueMatrix(Vector4 clipPlane); |
++++[clipPlane]:Vector4描述剪切平面;
++++計算並返回傾斜接近水平的投影矩陣;
++++給定一個剪輯平面向量,該函數返回攝像機的投影矩陣,投影矩陣的這個剪輯平面設置爲它的近平面;
++D4.2、CopyFrom
++D4.2、CopyFrom |
++D4.2、CopyFrom
++++立鑽哥哥:複製到;
void CopyFrom(Camera other); |
++++使這個攝像機的設置與其他攝像機相同;
++++這將從其他攝像機拷貝所有的攝像機變量(視野、清除標識、消隱遮罩),這也將設置攝像機的變換與其他攝像機相同,攝像機的層也與其他攝像機相同;
++++在做自定義渲染效果的時候,這可以用來設置一臺具有與其他攝像機設置完全相同的攝像機,例如在使用RenderWithShader時;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.CopyFrom(Camera.main); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.3、Render
++D4.3、Render |
++D4.3、Render
++++立鑽哥哥:渲染;
void Render(); |
++++手動渲染攝像機;
++++這個將渲染攝像機,這將使用攝像機的清除標記,目標紋理和所有其他設置;
++++攝像機將發送OnPreCull,OnPreCull,OnPreRender等到任何附加的腳本上,並渲染任何最後的圖像濾鏡;
++++這個用來精確地控制渲染次序,爲了使用這個特性,創建一個攝像機並禁用它,然後在它上面調用Render;
++++從一個正在渲染的攝像機調用Render函數是不允許的,如果需要可以先創建一個相匹配攝像機的副本;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{
Texture2D MyRTImage(Camera cam){ RenderTexture currentRT = RenderTexture.active; RenderTexture.active = cam.targetTexture;
cam.Render();
Texture2D image = new Texture2D(cam.targetTexture.width, cam.targetTexture.height); image.ReadPixels(new Rect(0, 0, cam.targetTexture.width, cam.targetTexture.height), 0, 0); image.Apply();
RenderTexture.active = currentRT;
return image; } //立鑽哥哥:Texture2D MyRTImage(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.4、RenderToCubemap
++D4.4、RenderToCubemap |
++D4.4、RenderToCubemap
++++立鑽哥哥:渲染到立方圖;
bool RenderToCubemap(Cubemap cubemap, int faceMask = 63);bool RenderToCubemap(RenderTexture cubemap, int faceMask = 63); |
++++從這個攝像機渲染到一個立方貼圖;
++++這是非常有用的,可以在編輯器中烘焙場景的靜態立方貼圖;
++++攝像機的位置,清除標誌和裁剪面距離將被使用來渲染到立方貼圖表面,FaceMask是一比特域,表示那個立方貼圖面應該被渲染,每個位對應於一個面;比特數是Cubemapface枚舉的整型值;默認的所有六個立方貼圖都被渲染(默認值63的低6位是打開的);
++++如果渲染失敗這個函數將返回false,某些顯卡不支持這個函數;
++++注意:這是一個Unity專業版屬性;
++D4.5、RenderWithShader
++D4.5、RenderWithShader |
++D4.5、RenderWithShader
++++立鑽哥哥:用Shader渲染;
void RenderWithShader(Shader shader, string replacementTag); |
++++用Shader替代渲染攝像機;
++++這個將渲染攝像機,這將使用攝像機的清除標記,目標設置爲其他所有設置;
++++這個攝像機不會發送OnPreCull,OnPreRender或OnPostRender到附加的腳本,圖像濾鏡也不會被渲染;
++++這個可用於特效,例如整個場景屏幕空間緩衝,熱效率等等;爲了使用這個特性,創建一個攝像機並禁用它,然後在它上面調用RenderWithShader;
++++對一個正在渲染的攝像機調用Render函數是不允許的;如果想這麼做可以拷貝一個匹配的副本攝像機;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Shader heatVisionShader;
void MyTestFunc(){ camera.RenderWithShader(heatVisionShader, “YanlzShaderVisibleWithHeat”); }
} //立鑽哥哥:public class YanlzCamera{} |
++D4.6、ResetAspect
++D4.6、ResetAspect |
++D4.6、ResetAspect
++++立鑽哥哥:重設長寬比;
void ResetAspect(); |
++++恢復長寬比爲屏幕的長寬比;
++++調用這個結束aspect設置的效果;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.ResetAspect(); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.7、ResetProjectionMatrix
++D4.7、ResetProjectionMatrix |
++D4.7、ResetProjectionMatrix
++++立鑽哥哥:重設投影矩陣;
void ResetProjectionMatrix(); |
++++讓投影反映正常的攝像機參數;
++++調用將結束projectionMatrix設置的效果;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void MyTestFunc(){ camera.ResetProjectionMatrix(); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.8、RestReplacementShader
++D4.8、RestReplacementShader |
++D4.8、RestReplacementShader
++++立鑽哥哥:重設替換Shader;
void ResetReplacementShader(); |
++++從攝像機上移除Shader替換;
++++調用將結束SetReplacementShader設置的效果;
++D4.9、RestWorldToCameraMatrix
++D4.9、RestWorldToCameraMatrix |
++D4.9、RestWorldToCameraMatrix
++++立鑽哥哥:重設世界轉攝像機矩陣;
void ResetWorldToCameraMatrix(); |
++++在場景中讓渲染位置反射攝像機的位置;
++++調用將結束worldToCameraMatrix設置的效果;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ camera.ResetWorldToCameraMatrix(); } //立鑽哥哥:public class YanlzCamera{} |
++D4.10、ScreenPointToRay
++D4.10、ScreenPointToRay |
++D4.10、ScreenPointToRay
++++立鑽哥哥:屏幕位置轉射線;
Ray ScreenPointToRay(Vector3 position); |
++++返回一條射線從攝像機通過一個屏幕點;
++++產生的射線是在世界空間中,從相機的近裁剪面開始並穿過屏幕position(x,y)像素座標(position.z被忽略);
++++屏幕空間以像素定義;屏幕的左下爲(0,0);右上是(pixelWidth, pixelHeight);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void Update(){ Ray ray = camera.ScreenPointToRay(new Vector3(200, 200, 0)); Debug.Log(ray.orgin, ray.direction * 10, Color.yellow); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.11、ScreenToViewportPoint
++D4.11、ScreenToViewportPoint |
++D4.11、ScreenToViewportPoint
++++立鑽哥哥:屏幕轉視窗位置;
Vector3 ScreenToViewportPoint(Vector3 position); |
++++從屏幕空間到視窗空間的變換位置;
++++屏幕空間以像素定義;屏幕的左下爲(0,0);右上是(pixelWidth, pixelHeight),Z的位置是以世界單位衡量的到攝像機的距離;
++++視口空間是規範化的並相對於攝像機;攝像機的左下爲(0,0);右上是(1,1),Z的位置是以世界單位衡量的到攝像機的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ void Update(){ transform.position = Camera.main.ScreenToViewportPoint(Input.mousePosition); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.12、ScreenToWorldPoint
++D4.12、ScreenToWorldPoint |
++D4.12、ScreenToWorldPoint
++++立鑽哥哥:屏幕轉世界位置;
Vector3 ScreenToWorldPoint(Vector3 position); |
++++從屏幕空間到世界空間的變化位置;
++++屏幕空間以像素定義;屏幕的左下爲(0,0);右上是(pixelWidth, pixelHeight),Z的位置是以世界單位衡量的到攝像機的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{
void OnDrawGizmosSelected(){ Vector3 p = camera.ScreenToWorldPoint(new Vector3(100, 100, camera.nearClipPlane)); Gizmos.color = Color.yellow; Gizmos.DrawSphere(p, 0.1F); } //立鑽哥哥:void OnDrawGizmosSelected(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.13、SetReplacementShader
++D4.13、SetReplacementShader |
++D4.13、SetReplacementShader
++++立鑽哥哥:設置替換着色器;
void SetReplacementShader(Shader shader, string replacementTag); |
++++使攝像機渲染用着色器替換;
++++調用這個函數之後,攝像機將使用替換的Shader來渲染它的視圖;調用ResetReplacementShader來重置回普通的渲染;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Shader heatVisionShader;
void MyTestFunc(){ camera.SetReplacementShader(heatVisionShader, “YanlzShaderVisibleWithHeat”); } } //立鑽哥哥:public class YanlzCamera{} |
++D4.14、setTargetBuffers
++D4.14、setTargetBuffers |
++D4.14、setTargetBuffers
++++立鑽哥哥:設置目標緩衝區域;
void SetTargetBuffers(RenderBuffer colorBuffer, RenderBuffer depthBuffer);void SetTargetBuffers(RenderBuffer[] colorBuffer, RenderBuffer depthBufffer); |
++++[colorBuffer]:渲染緩存的顏色信息將被渲染;
++++[depthBuffer]:渲染緩存的深度信息將被渲染;
++++設置攝像機渲染到一個或多個RenderTextures所選擇的緩衝區;
++D4.15、ViewportPointToRay
++D4.15、ViewportPointToRay |
++D4.15、ViewportPointToRay
++++立鑽哥哥:視窗位置轉射線;
Ray ViewportPointToRay(Vector3 position); |
++++返回從攝像機出發穿過視點的一個射線;
++++產生的射線是在世界空間中,從攝像機的近裁剪面開始並穿過視口POSITION(x,y)座標(position.z被忽略);
++++視窗座標被規範化,並相對於攝像機;攝像機的左下爲(0,0);右上是(1,1);
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{
void Update(){ Ray ray = camera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0)); RaycastHit hit;
if(Physics.Raycast(ray, out hit)){ Debug.Log(“立鑽哥哥:I’m looking at ” + hit.transform.name); }else{ Debug.Log(“立鑽哥哥:I’m looking at nothing.”); } } //立鑽哥哥:void Update(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.16、ViewPortToScreenPoint
++D4.16、ViewPortToScreenPoint |
++D4.16、ViewPortToScreenPoint
++++立鑽哥哥:視窗轉屏幕位置;
Vector3 ViewportToScreenPoint(Vector3 position); |
++++從視口空間到屏幕空間的變換位置;
++++視口空間是規範化的並相對於攝像機;攝像機的左下爲(0,0),右上是(1.1),Z的位置是以世界單位衡量的到攝像機的距離;
++++屏幕空間以像素定義;屏幕的左下爲(0,0);右上是(pixelWidth, pixelHeight),Z的位置是以世界單位衡量的到攝像機的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Texture2D bottomPanel;
void MyTestVPToScreenPt(){ Vector3 origin = Camera.main.ViewportToScreenPoint(new Vector3(0.25F, 0.1F, 0)); Vector3 extent = Camera.main.ViewportToSceenPoint(new Vector3(0.5F, 0.2F, 0));
GUI.DrawTexture(new Rect(origin.x, origin.y, extent.x, extent.y), bottomPanel); } //立鑽哥哥:void MyTestVPToScreenPt(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.17、ViewportToWorldPoint
++D4.17、ViewportToWorldPoint |
++D4.17、ViewportToWorldPoint
++++立鑽哥哥:視窗轉世界位置;
Vector3 ViewportToWorldPoint(Vector3 position); |
++++從視窗空間到世界空間的變換位置;
++++視窗空間是歸一化的並相對於攝像機的,攝像機的左下爲(0,0);右上是(1,1);Z的位置是以世界單位衡量的到攝像機的距離;
++++請注意:它是變換一個x-y屏幕位置到一個3D空間的x-y-z位置;
++++這個函數帶有在屏幕座標的x-y組件向量,並且z組件是在從攝像機產生的平面的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{
void OnDrawGizmosSelected(){ Vector3 p = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane)); Gizmos.color = Color.yellow; Gizmos.DrawSphere(p, 0.1F); } //立鑽哥哥:void OnDrawGizmosSelected(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.18、WorldToScreenPoint
++D4.18、WorldToScreenPoint |
++D4.18、WorldToScreenPoint
++++立鑽哥哥:世界轉屏幕位置;
Vector3 WorldToScreenPoint(Vector3 position); |
++++從世界空間到屏幕空間變換位置;
++++屏幕空間以像素定義,屏幕左下爲(0,0),右上是(pixelWidth, pixelHeight),Z的位置是以世界單位衡量的到相機的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Transform target;
void Update(){ Vector3 screenPos = camera.WorldToScreenPoint(target.position); Debug.Log(“立鑽哥哥:target is ” + screenPos.x + “ pixels from the left.”); } //立鑽哥哥:void Update(){}
} //立鑽哥哥:public class YanlzCamera{} |
++D4.19、WorldToViewportPoint
++D4.19、WorldToViewportPoint |
++D4.19、WorldToViewportPoint
++++立鑽哥哥:世界轉視窗位置;
Vector3 WorldToViewportPoint(Vector3 position); |
++++從世界空間到視窗空間的變換位置;
++++視窗空間是歸一化的並相對於攝像機的;攝像機的左下爲(0,0);右上是(1,1),Z的位置是以世界單位衡量的到攝像機的距離;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ public Transform target;
void Update(){ Vector3 viewPos = camera.WorldToViewportPoint(target, position);
if(viewPos.x > 0.5F){ Debug.Log(“立鑽哥哥:target is on the right side!”); }else{ Debug.Log(“立鑽哥哥:target is on the left side!”); } } //立鑽哥哥:void Update(){}
} //立鑽哥哥:public class YanlzCamera{} |
#E5、Staic Functions函數
#E5、Static Functions函數 |
++E5、Static Functions函數++++E5.1、GetAllCameras++++E5.2、YanlzAPI.Camera.StaticFunctions |
++E5.1、GetAllCameras
++E5.1、GetAllCameras |
++E5.1、GetAllCameras
++++立鑽哥哥:獲取所有攝像機;
static int GetAllCameras(Camera[] cameras); |
++++[cameras]:用當前場景中的攝像機填補攝像機的數組;
++++用當前場景中的攝像機填補攝像機的數組,而不需要分配一個新的數組;
++++數組的大小必須大於allCamerasCount的值;
++++當數組的大小大於了allCamerasCount的值,只有第一個元素到allCamerasCount值將會被填入數組;
++++當數組的大小小於了allCamerasCount的值,將拋出參數異常;
++++當數組傳遞的參數是空,此次調用將會拋出未將對象引用到實例;
++++返回值將會顯示多少攝像機放入了這個數組;
#F6、Message消息
#F6、Message消息 |
++F6、Message消息++++F6.1、OnPostRender++++F6.2、OnPreCull++++F6.3、OnRenderImage++++F6.4、OnRenderObject++++F6.5、OnWillRenderObject++++F6.6、YanlzAPI.Camera.Message |
++F6.1、OnPostRender
++F6.1、OnPostRender |
++F6.1、OnPostRender
++++立鑽哥哥:渲染之後;
Camera.OnPostRender(); |
++++OnPostRender函數在攝像機渲染場景之後調用;
++++這個消息被髮送到所有附加在攝像機的腳本;
using UnityEngine; using System.Collections;
public class YanlzCamera : MonoBehaviour{ private bool revertFogState = false;
void OnPreRender(){ revertFogState = RenderSettings.fog; RenderSettings.fog = enabled; } //立鑽哥哥:void OnPreRender(){}
void OnPostRender(){ RenderSettings.fog = revertFogState; } //立鑽哥哥:void OnPostRender(){}
} //立鑽哥哥:public class YanlzCamera{} |
++F6.2、OnPreCull
++F6.2、OnPreCull |
@@提示:有些博客可能只是開了頭,如果感興趣的同學,可以“點贊”或“評論區留言”,只要關注的同學多了,那就會繼續完善喲!(“++==”,表示沒有寫完的,如果關注度不高就不完善了;“++ok++”,表示此篇博客已經完成,是階段性完整的!)
++++VR雲遊戲=Unity+SteamVR+雲技術+5G+AI;(說明:AI人工智能不是我們的主要研究技術,只是瞭解一下,領略一下有風的感覺!但是,VR是我們的研究重點)
++++【Unity開發基礎】分類:https://blog.csdn.net/vrunsoftyanlz/category_7309057.html
++++【Linux系統編程】分類:https://blog.csdn.net/vrunsoftyanlz/category_9694767.html
++++【C++C鑄就生存利器】分類:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分類:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立鑽哥哥CSDN空間】:https://blog.csdn.net/VRunSoftYanlz/
【XR遊戲開發QQ羣:784477094】
++立鑽哥哥推薦的拓展學習鏈接(Link_Url):
立鑽哥哥推薦的拓展學習鏈接(Link_Url) |
++++立鑽哥哥Unity 學習空間: http://blog.csdn.net/VRunSoftYanlz/
++++虛擬現實VR資訊: https://blog.csdn.net/VRunSoftYanlz/article/details/89165846
++++HTC_VIVE開發基礎:https://blog.csdn.net/VRunSoftYanlz/article/details/81989970
++++Oculus雜談:https://blog.csdn.net/VRunSoftYanlz/article/details/82469850
++++Oculus安裝使用:https://blog.csdn.net/VRunSoftYanlz/article/details/82718982
++++Unity+SteamVR=>VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88809370
++++Unity減少VR暈眩症:https://blog.csdn.net/VRunSoftYanlz/article/details/89115518
++++SteamVR簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86484254
++++SteamVR腳本功能分析:https://blog.csdn.net/VRunSoftYanlz/article/details/86531480
++++SteamVR2.0開發指南:https://blog.csdn.net/VRunSoftYanlz/article/details/86618187
++++SteamVR2.2.0開發指南:https://blog.csdn.net/VRunSoftYanlz/article/details/88784527
++++SteamVR2.2.0快速入門:https://blog.csdn.net/VRunSoftYanlz/article/details/88833579
++++SteamVR2.2.0交互系統:https://blog.csdn.net/VRunSoftYanlz/article/details/89199778
++++SteamVR2.2.0傳送機制:https://blog.csdn.net/VRunSoftYanlz/article/details/89390866
++++SteamVR2.2.0教程(一):https://blog.csdn.net/VRunSoftYanlz/article/details/89324067
++++SteamVR2.2.0教程(二):https://blog.csdn.net/VRunSoftYanlz/article/details/89894097
++++SteamVR_Skeleton_Poser:https://blog.csdn.net/VRunSoftYanlz/article/details/89931725
++++SteamVR實戰之PMCore:https://blog.csdn.net/VRunSoftYanlz/article/details/89463658
++++SteamVR/Extras:https://blog.csdn.net/VRunSoftYanlz/article/details/86584108
++++SteamVR/Input:https://blog.csdn.net/VRunSoftYanlz/article/details/86601950
++++OpenXR簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/85726365
++++VRTK雜談:https://blog.csdn.net/VRunSoftYanlz/article/details/82562993
++++VRTK快速入門(雜談):https://blog.csdn.net/VRunSoftYanlz/article/details/82955267
++++VRTK官方示例(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82955410
++++VRTK代碼結構(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82780085
++++VRTK(SceneResources):https://blog.csdn.net/VRunSoftYanlz/article/details/82795400
++++VRTK_ControllerEvents:https://blog.csdn.net/VRunSoftYanlz/article/details/83099512
++++VRTK_InteractTouch:https://blog.csdn.net/VRunSoftYanlz/article/details/83120220
++++虛擬現實行業應用:https://blog.csdn.net/VRunSoftYanlz/article/details/88360157
++++Steam平臺上的VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88960085
++++Steam平臺熱銷VR:https://blog.csdn.net/VRunSoftYanlz/article/details/89007741
++++VR實驗:以太網幀的構成:https://blog.csdn.net/VRunSoftYanlz/article/details/82598140
++++實驗四:存儲器擴展實驗:https://blog.csdn.net/VRunSoftYanlz/article/details/87834434
++++FrameVR示例V0913:https://blog.csdn.net/VRunSoftYanlz/article/details/82808498
++++FrameVR示例V1003:https://blog.csdn.net/VRunSoftYanlz/article/details/83066516
++++SwitchMachineV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++PlaySceneManagerV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++Unity5.x用戶手冊:https://blog.csdn.net/VRunSoftYanlz/article/details/81712741
++++Unity面試題ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面試題D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity面試題E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity面試題F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945
++++Cocos2dx面試題:https://blog.csdn.net/VRunSoftYanlz/article/details/78630967
++++禪道[zentao]:https://blog.csdn.net/VRunSoftYanlz/article/details/83964057
++++Lua快速入門篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818
++++Lua快速入門篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++Lua快速入門篇(基礎概述):https://blog.csdn.net/VRunSoftYanlz/article/details/81041359
++++框架知識點:https://blog.csdn.net/VRunSoftYanlz/article/details/80862879
++++遊戲框架(UI框架夯實篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80781140
++++遊戲框架(初探篇):https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++.Net框架設計:https://blog.csdn.net/VRunSoftYanlz/article/details/87401225
++++從零開始學架構:https://blog.csdn.net/VRunSoftYanlz/article/details/88095895
++++設計模式簡單整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++專題:設計模式(精華篇):https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++U3D小項目參考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++Unity小遊戲算法分析:https://blog.csdn.net/VRunSoftYanlz/article/details/87908365
++++Unity案例(Vehicle):https://blog.csdn.net/VRunSoftYanlz/article/details/82355876
++++UML類圖:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++PowerDesigner簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86500084
++++Unity知識點0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++Unity知識點0008:https://blog.csdn.net/VRunSoftYanlz/article/details/81153606
++++U3D_Shader編程(第一篇:快速入門篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader編程(第二篇:基礎夯實篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++Unity引擎基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向組件開發:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系統:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平臺開發:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI進階:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI綜合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity動畫系統基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity動畫系統進階:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation導航系統:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity數據存儲:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite數據庫:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW類和協程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity網絡:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++Unity資源加密:https://blog.csdn.net/VRunSoftYanlz/article/details/87644514
++++PhotonServer簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86652770
++++編寫Photon遊戲服務器:https://blog.csdn.net/VRunSoftYanlz/article/details/86682935
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委託:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#靜態類:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String類:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#數據類型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默認的快捷鍵:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++遊戲相關縮寫:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++UnityAPI.Rigidbody剛體:https://blog.csdn.net/VRunSoftYanlz/article/details/81784053
++++UnityAPI.Material材質:https://blog.csdn.net/VRunSoftYanlz/article/details/81814303
++++UnityAPI.Android安卓:https://blog.csdn.net/VRunSoftYanlz/article/details/81843193
++++UnityAPI.AndroidJNI安卓JNI:https://blog.csdn.net/VRunSoftYanlz/article/details/81879345
++++UnityAPI.Transform變換:https://blog.csdn.net/VRunSoftYanlz/article/details/81916293
++++UnityAPI.WheelCollider輪碰撞器:https://blog.csdn.net/VRunSoftYanlz/article/details/82356217
++++UnityAPI.Resources資源:https://blog.csdn.net/VRunSoftYanlz/article/details/83155518
++++JSON數據結構:https://blog.csdn.net/VRunSoftYanlz/article/details/82026644
++++CocosStudio快速入門:https://blog.csdn.net/VRunSoftYanlz/article/details/82356839
++++Unity企業內訓(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82634668
++++Unity企業內訓(第1講):https://blog.csdn.net/VRunSoftYanlz/article/details/82634733
++++Unity企業內訓(第2講):https://blog.csdn.net/VRunSoftYanlz/article/details/82861180
++++Unity企業內訓(第3講):https://blog.csdn.net/VRunSoftYanlz/article/details/82927699
++++Unity企業內訓(第4講):https://blog.csdn.net/VRunSoftYanlz/article/details/83479776
++++Unity企業內訓(第5講):https://blog.csdn.net/VRunSoftYanlz/article/details/83963811
++++Unity企業內訓(第6講):https://blog.csdn.net/VRunSoftYanlz/article/details/84207696
++++鑽哥帶您瞭解產品原型:https://blog.csdn.net/VRunSoftYanlz/article/details/87303828
++++插件<Obi Rope>:https://blog.csdn.net/VRunSoftYanlz/article/details/83963905
++++計算機組成原理(教材篇):https://blog.csdn.net/VRunSoftYanlz/article/details/82719129
++++5G接入:雲計算和霧計算:https://blog.csdn.net/VRunSoftYanlz/article/details/88372718
++++雲計算通俗講義:https://blog.csdn.net/VRunSoftYanlz/article/details/88652803
++++立鑽哥哥Unity 學習空間: http://blog.csdn.net/VRunSoftYanlz
--_--VRunSoft:lovezuanzuan--_--