-
车灯的炫光添加的主键,带有光晕效果:
-
镜面反射:创建一个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; } }
-
摄像机随着鼠标的拖动和中间滑轮的放大缩小,脚本放在摄像机上面:
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); } }
汽车展示插件可学习的地方
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- ##反射面的代码 using UnityEngine; using System.Collections; // ...
- 该系列笔记基于Unity3D 5.x的版本学习,部分API使用和4.x不一致。 目前在Unity3D中,除了新的U...
- 一次偶然,我关注了“笔耕不辍”这个公众号。又一次偶然,我瞥到“21天爱上写作训练营-第六期”开营公告,被深深地吸引...