-
車燈的炫光添加的主鍵,帶有光暈效果:
-
鏡面反射:創(chuàng)建一個Plane在上面掛上一個腳本就行级遭,代碼如下:
using UnityEngine; using System.Collections; [ExecuteInEditMode] public class MirrorReflectionScript :MonoBehaviour { public bool m_DisablePixelLights = true; public int m_TextureSize = 1024; public float m_ClipPlaneOffset = 0.07f; public LayerMask m_ReflectLayers = -1; private Hashtable m_ReflectionCameras = new Hashtable(); private RenderTexture m_ReflectionTexture = null; private int m_OldReflectionTextureSize = 0; private static bool s_InsideRendering = false; public void OnWillRenderObject() { var rend = GetComponent<Renderer>(); if (!enabled || !rend || !rend.sharedMaterial || !rend.enabled) return; Camera cam = Camera.current; if( !cam ) return; if( s_InsideRendering ) return; s_InsideRendering = true; Camera reflectionCamera; CreateMirrorObjects( cam, out reflectionCamera ); Vector3 pos = transform.position; Vector3 normal = transform.up; int oldPixelLightCount = QualitySettings.pixelLightCount; if( m_DisablePixelLights ) QualitySettings.pixelLightCount = 0; UpdateCameraModes( cam, reflectionCamera ); float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset; Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d); Matrix4x4 reflection = Matrix4x4.zero; CalculateReflectionMatrix (ref reflection, reflectionPlane); Vector3 oldpos = cam.transform.position; Vector3 newpos = reflection.MultiplyPoint( oldpos ); reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection; Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f ); Matrix4x4 projection = cam.CalculateObliqueMatrix(clipPlane); reflectionCamera.projectionMatrix = projection; reflectionCamera.cullingMask = ~(1<<4) & m_ReflectLayers.value; reflectionCamera.targetTexture = m_ReflectionTexture; GL.SetRevertBackfacing (true); reflectionCamera.transform.position = newpos; Vector3 euler = cam.transform.eulerAngles; reflectionCamera.transform.eulerAngles = new Vector3(0, euler.y, euler.z); reflectionCamera.Render(); reflectionCamera.transform.position = oldpos; GL.SetRevertBackfacing (false); Material[] materials = rend.sharedMaterials; foreach( Material mat in materials ) { if( mat.HasProperty("_ReflectionTex") ) mat.SetTexture( "_ReflectionTex", m_ReflectionTexture ); } if( m_DisablePixelLights ) QualitySettings.pixelLightCount = oldPixelLightCount; s_InsideRendering = false; } void OnDisable() { if( m_ReflectionTexture ) { DestroyImmediate( m_ReflectionTexture ); m_ReflectionTexture = null; } foreach( DictionaryEntry kvp in m_ReflectionCameras ) DestroyImmediate( ((Camera)kvp.Value).gameObject ); m_ReflectionCameras.Clear(); } private void UpdateCameraModes( Camera src, Camera dest ) { if( dest == null ) return; dest.clearFlags = src.clearFlags; dest.backgroundColor = src.backgroundColor; if( src.clearFlags == CameraClearFlags.Skybox ) { Skybox sky = src.GetComponent(typeof(Skybox)) as Skybox; Skybox mysky = dest.GetComponent(typeof(Skybox)) as Skybox; if( !sky || !sky.material ) { mysky.enabled = false; } else { mysky.enabled = true; mysky.material = sky.material; } } dest.farClipPlane = src.farClipPlane; dest.nearClipPlane = src.nearClipPlane; dest.orthographic = src.orthographic; dest.fieldOfView = src.fieldOfView; dest.aspect = src.aspect; dest.orthographicSize = src.orthographicSize; } private void CreateMirrorObjects( Camera currentCamera, out Camera reflectionCamera ) { reflectionCamera = null; if( !m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize ) { if( m_ReflectionTexture ) DestroyImmediate( m_ReflectionTexture ); m_ReflectionTexture = new RenderTexture( m_TextureSize, m_TextureSize, 16 ); m_ReflectionTexture.name = "__MirrorReflection" + GetInstanceID(); m_ReflectionTexture.isPowerOfTwo = true; m_ReflectionTexture.hideFlags = HideFlags.DontSave; m_OldReflectionTextureSize = m_TextureSize; } reflectionCamera = m_ReflectionCameras[currentCamera] as Camera; if( !reflectionCamera ) { GameObject go = new GameObject( "Mirror Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera), typeof(Skybox) ); reflectionCamera = go.GetComponent<Camera>(); reflectionCamera.enabled = false; reflectionCamera.transform.position = transform.position; reflectionCamera.transform.rotation = transform.rotation; reflectionCamera.gameObject.AddComponent<FlareLayer>(); go.hideFlags = HideFlags.HideAndDontSave; m_ReflectionCameras[currentCamera] = reflectionCamera; } } private static float sgn(float a) { if (a > 0.0f) return 1.0f; if (a < 0.0f) return -1.0f; return 0.0f; } private Vector4 CameraSpacePlane (Camera cam, Vector3 pos, Vector3 normal, float sideSign) { Vector3 offsetPos = pos + normal * m_ClipPlaneOffset; Matrix4x4 m = cam.worldToCameraMatrix; Vector3 cpos = m.MultiplyPoint( offsetPos ); Vector3 cnormal = m.MultiplyVector( normal ).normalized * sideSign; return new Vector4( cnormal.x, cnormal.y, cnormal.z, -Vector3.Dot(cpos,cnormal) ); } private static void CalculateReflectionMatrix (ref Matrix4x4 reflectionMat, Vector4 plane) { reflectionMat.m00 = (1F - 2F*plane[0]*plane[0]); reflectionMat.m01 = ( - 2F*plane[0]*plane[1]); reflectionMat.m02 = ( - 2F*plane[0]*plane[2]); reflectionMat.m03 = ( - 2F*plane[3]*plane[0]); reflectionMat.m10 = ( - 2F*plane[1]*plane[0]); reflectionMat.m11 = (1F - 2F*plane[1]*plane[1]); reflectionMat.m12 = ( - 2F*plane[1]*plane[2]); reflectionMat.m13 = ( - 2F*plane[3]*plane[1]); reflectionMat.m20 = ( - 2F*plane[2]*plane[0]); reflectionMat.m21 = ( - 2F*plane[2]*plane[1]); reflectionMat.m22 = (1F - 2F*plane[2]*plane[2]); reflectionMat.m23 = ( - 2F*plane[3]*plane[2]); reflectionMat.m30 = 0F; reflectionMat.m31 = 0F; reflectionMat.m32 = 0F; reflectionMat.m33 = 1F; } }
-
攝像機(jī)隨著鼠標(biāo)的拖動和中間滑輪的放大縮小,腳本放在攝像機(jī)上面:
using UnityEngine; using System.Collections; public class CameraRotate : MonoBehaviour { public Transform targetObject; public Vector3 targetOffset; public float averageDistance = 5.0f; public float maxDistance = 20; public float minDistance = .6f; public float xSpeed = 200.0f; public float ySpeed = 200.0f; public int yMinLimit = -80; public int yMaxLimit = 80; public int zoomSpeed = 40; public float panSpeed = 0.3f; public float zoomDampening = 5.0f; public float rotateOnOff = 1; private float xDeg = 0.0f; private float yDeg = 0.0f; private float currentDistance; private float desiredDistance; private Quaternion currentRotation; private Quaternion desiredRotation; private Quaternion rotation; private Vector3 position; private float idleTimer = 0.0f; private float idleSmooth = 0.0f; void Start() { Init(); } void OnEnable() { Init(); } public void Init() { if (!targetObject) { GameObject go = new GameObject("Cam Target"); go.transform.position = transform.position + (transform.forward * averageDistance); targetObject = go.transform; } currentDistance = averageDistance; desiredDistance = averageDistance; position = transform.position; rotation = transform.rotation; currentRotation = transform.rotation; desiredRotation = transform.rotation; xDeg = Vector3.Angle(Vector3.right, transform.right ); yDeg = Vector3.Angle(Vector3.up, transform.up ); position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset); } void LateUpdate() { if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl)) { desiredDistance -= Input.GetAxis("Mouse Y") * 0.02f * zoomSpeed*0.125f * Mathf.Abs(desiredDistance); } else if (Input.GetMouseButton(0) ) { xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f; yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit); desiredRotation = Quaternion.Euler(yDeg, xDeg, 0); currentRotation = transform.rotation; rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening); transform.rotation = rotation; idleTimer=0; idleSmooth=0; }else{ idleTimer+=0.02f ; if(idleTimer > rotateOnOff && rotateOnOff > 0){ idleSmooth+=(0.02f +idleSmooth)*0.005f; idleSmooth = Mathf.Clamp(idleSmooth, 0, 1); xDeg += xSpeed * 0.001f * idleSmooth; } yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit); desiredRotation = Quaternion.Euler(yDeg, xDeg, 0); currentRotation = transform.rotation; rotation = Quaternion.Lerp(currentRotation, desiredRotation, 0.02f * zoomDampening*2); transform.rotation = rotation; } desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * 0.02f * zoomSpeed * Mathf.Abs(desiredDistance); desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance); currentDistance = Mathf.Lerp(currentDistance, desiredDistance, 0.02f * zoomDampening); position = targetObject.position - (rotation * Vector3.forward * currentDistance + targetOffset); transform.position = position; } private static float ClampAngle(float angle, float min, float max) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp(angle, min, max); } }
汽車展示插件可學(xué)習(xí)的地方
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門旅东,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灭抑,“玉大人,你說我怎么就攤上這事抵代∶樱” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵主守,是天一觀的道長禀倔。 經(jīng)常有香客問我,道長参淫,這世上最難降的妖魔是什么救湖? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮涎才,結(jié)果婚禮上鞋既,老公的妹妹穿的比我還像新娘。我一直安慰自己耍铜,他們只是感情好邑闺,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棕兼,像睡著了一般陡舅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伴挚,一...
- 文/蒼蘭香墨 我猛地睜開眼铡原,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了商叹?” 一聲冷哼從身側(cè)響起燕刻,我...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡枯途,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年忌怎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪夷。...
- 正文 年R本政府宣布坦报,位于F島的核電站库说,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏片择。R本人自食惡果不足惜潜的,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望字管。 院中可真熱鬧啰挪,春花似錦、人聲如沸嘲叔。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽硫戈。三九已至锰什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歇由。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長得像辛掠,于是被迫代替她去往敵國和親谢谦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- ##反射面的代碼 using UnityEngine; using System.Collections; // ...
- 該系列筆記基于Unity3D 5.x的版本學(xué)習(xí)萝衩,部分API使用和4.x不一致回挽。 目前在Unity3D中,除了新的U...
- 1,dom對象的innerText和innerHTML有什么區(qū)別牌捷? innerText是將對象中的字符串過濾組合展...
- 碼市 Slogan 創(chuàng)業(yè)公司的決定往往讓人出其不意 為了籌備10月20號碼市產(chǎn)品發(fā)布會暗甥,CODING 開發(fā)團(tuán)隊從9...
- 一次偶然撤防,我關(guān)注了“筆耕不輟”這個公眾號虽风。又一次偶然,我瞥到“21天愛上寫作訓(xùn)練營-第六期”開營公告寄月,被深深地吸引...