
大佬們求救呀
不知道為什么自己在重繪Preview界面時會有一部分會被遮擋 但是對于模型卻沒有影響 下面是代碼
class PreviewEditor : Editor
{
private PreviewRenderUtility m_PreviewUtility;
private GameObject m_PreviewInstance;
// 預覽物件的包圍盒
private Bounds m_PreviewBounds;
// 預覽的方向
private Vector2 m_PreviewDir = new Vector2(120f, -20f);
private Vector3 m_ScrollZoom = Vector3.zero;
public override bool HasPreviewGUI()
{
return true;
}
private void AddSingleGO(GameObject go)
{
#if UNITY_2017_1_OR_NEWER
m_PreviewUtility.AddSingleGO(go);
#endif
}
Camera camera;
public override void OnPreviewGUI(Rect r, GUIStyle background)
{
Debug.Log(r);
//r.width = 1500;
InitPreview();
// 上下左右的旋轉
Vector3 zoom;
m_PreviewDir = Drag2D(m_PreviewDir, r, out zoom);
m_ScrollZoom += zoom;
m_ScrollZoom.y = Mathf.Max(-33f, Mathf.Min(m_ScrollZoom.y, 44));
if (Event.current.type != EventType.Repaint)
{
return;
}
m_PreviewUtility.BeginPreview(r, background);
camera = m_PreviewUtility.camera;
m_PreviewBounds.size = new Vector3(1, 1,1);
float num = Mathf.Max(m_PreviewBounds.extents.magnitude, 0.0001f);
float num2 = num * 3.8f;
Quaternion quaternion = Quaternion.Euler(-m_PreviewDir.y, -m_PreviewDir.x, 0f);
Vector3 position = m_PreviewBounds.center - quaternion * (Vector3.forward * num2) * (1 + m_ScrollZoom.y * 0.02f);
//Vector3 position = new Vector3(0.0f, 0, 0.0f);
//m_PreviewUtility.cameraFieldOfView = 30;
camera.transform.position = position;
camera.transform.rotation = quaternion;
camera.nearClipPlane = 0.1f;
camera.farClipPlane = 1000.0f;
camera.fieldOfView = 80;
camera.allowHDR = false;
camera.allowMSAA = false;
camera.clearFlags = CameraClearFlags.Depth;
//camera.rect = new Rect(0, 0, 2, 2);
for (int i = 0; i < m_PreviewUtility.lights.Length; i ++)
{
m_PreviewUtility.lights[i] = new Light();
m_PreviewUtility.lights[i].transform.rotation = quaternion;
}
SetEnabledRecursive(m_PreviewInstance, true);
// Draw Line
ShowLayerGrid(m_PreviewInstance.transform.position);
camera.Render();
SetEnabledRecursive(m_PreviewInstance, false);
var texture = m_PreviewUtility.EndPreview();
Debug.Log(r);
GUI.DrawTexture(r, texture, ScaleMode.ScaleToFit, false);
//GUI.Box(r, texture);
//m_PreviewUtility.EndAndDrawPreview(r);
}
public override void DrawPreview(Rect previewArea)
{
base.DrawPreview(previewArea);
GUILayout.BeginHorizontal();
if (GUILayout.Button("前"))
{
m_PreviewDir = new Vector2(0, 0);
//Debug.Log(m_PreviewDir + " 前");
}
if (GUILayout.Button("后"))
{
m_PreviewDir = new Vector2(-180, 0);
//Debug.Log(m_PreviewDir + " 后");
}
if (GUILayout.Button("左"))
{
m_PreviewDir = new Vector2(-90, 0);
//Debug.Log(m_PreviewDir + " 左");
}
if (GUILayout.Button("右"))
{
m_PreviewDir = new Vector2(90, 0);
//Debug.Log(m_PreviewDir + " 右");
}
if (GUILayout.Button("還原"))
{
m_PreviewDir = new Vector2(120f, -20f);
m_ScrollZoom = Vector3.zero;
}
GUILayout.EndHorizontal();
}
private void InitPreview()
{
if (m_PreviewUtility == null)
{
// 引數true代表繪制場景內的游戲物件
m_PreviewUtility = new PreviewRenderUtility(true);
// 設定攝像機的一些引數
m_PreviewUtility.cameraFieldOfView = 30;//0.7f;
// 創建預覽的游戲物件
CreatePreviewInstances();
//SceneView.onSceneGUIDelegate += OnSceneGUI;
}
m_PreviewUtility.camera.cullingMask = 1 << kPreviewCullingLayer;
}
private void DestroyPreview()
{
if (m_PreviewUtility != null)
{
// 務必要進行清理,才不會殘留生成的攝像機物件等
m_PreviewUtility.Cleanup();
m_PreviewUtility = null;
}
}
private int offsetz;
private void ShowLayerGrid(Vector3 origin)
{
Vector3 start = Vector3.zero;
Vector3 end = Vector3.zero;
int num = 10;
float step = 1.0f;
float linelength = step * num;
float sb_x = -num / 2.0f * step;
float sb_z = -num / 2.0f * step;
for (float x =0; x < num+1; x ++)
{
start.Set(sb_x + x * step, 0, sb_z);
//start.Set(512, 128, 0);
////Debug.Log(start);
end.Set(start.x, 0, start.z + linelength);
var b = camera.WorldToScreenPoint(start);
if (b.z < 0)
continue;
b.z = 1.0f;
var e = camera.WorldToScreenPoint(end);
if (e.z < 0)
continue;
e.z = 1.0f;
Handles.DrawLine(b, e);
//Debug.Log(camera.WorldToScreenPoint(origin) + " " + camera.WorldToScreenPoint(end));
}
for (float z = 0; z < num+1; z++)
{
start.Set(sb_x, 0, sb_z + z * step);
//start.Set(512, 128, 0);
////Debug.Log(start);
end.Set(start.x + linelength, 0, start.z);
var b = camera.WorldToScreenPoint(start);
if (b.z < 0)
continue;
b.z = 1.0f;
var e = camera.WorldToScreenPoint(end);
if (e.z < 0)
continue;
e.z = 1.0f;
Handles.DrawLine(b, e);
//Debug.Log(camera.WorldToScreenPoint(origin) + " " + camera.WorldToScreenPoint(end));
}
}
private void DestroyPreviewInstances()
{
if (m_PreviewInstance != null)
{
DestroyImmediate(m_PreviewInstance);
}
m_PreviewInstance = null;
}
void OnDestroy()
{
DestroyPreviewInstances();
DestroyPreview();
}
private void CreatePreviewInstances()
{
DestroyPreviewInstances();
// 查找要繪制的游戲物件
m_PreviewInstance = target as GameObject;//GameObject.Find("ThirdPerson"); //levelObstacle.Model;//
if (m_PreviewInstance == null)
{
//return;
m_PreviewInstance = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
// 實體化物件
m_PreviewInstance = Instantiate(m_PreviewInstance, Vector3.zero, Quaternion.identity) as GameObject;
m_PreviewInstance.transform.localScale = 100 * Vector3.one;
// 遞回設定隱藏標志和層
InitInstantiatedPreviewRecursive(m_PreviewInstance);
// 關閉物件渲染
SetEnabledRecursive(m_PreviewInstance, true);
m_PreviewBounds = new Bounds(m_PreviewInstance.transform.position, Vector3.zero);
GetRenderableBoundsRecurse(ref m_PreviewBounds, m_PreviewInstance);
AddSingleGO(m_PreviewInstance);
}
public static void GetRenderableBoundsRecurse(ref Bounds bounds, GameObject go)
{
MeshRenderer meshRenderer = go.GetComponent(typeof(MeshRenderer)) as MeshRenderer;
MeshFilter meshFilter = go.GetComponent(typeof(MeshFilter)) as MeshFilter;
if (meshRenderer && meshFilter && meshFilter.sharedMesh)
{
if (bounds.extents == Vector3.zero)
{
bounds = meshRenderer.bounds;
}
else
{
// 擴展包圍盒,以讓包圍盒能夠包含另一個包圍盒
bounds.Encapsulate(meshRenderer.bounds);
}
}
SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent(typeof(SkinnedMeshRenderer)) as SkinnedMeshRenderer;
if (skinnedMeshRenderer && skinnedMeshRenderer.sharedMesh)
{
if (bounds.extents == Vector3.zero)
{
bounds = skinnedMeshRenderer.bounds;
}
else
{
bounds.Encapsulate(skinnedMeshRenderer.bounds);
}
}
foreach (Transform transform in go.transform)
{
GetRenderableBoundsRecurse(ref bounds, transform.gameObject);
}
}
public static Vector2 Drag2D(Vector2 scrollPosition, Rect position, out Vector3 m_scroll)
{
m_scroll = Vector3.zero;
int controlID = GUIUtility.GetControlID("Slider".GetHashCode(), FocusType.Passive);
Event current = Event.current;
switch (current.GetTypeForControl(controlID))
{
case EventType.MouseDown:
if (position.Contains(current.mousePosition) && position.width > 50f)
{
GUIUtility.hotControl = controlID;
current.Use();
// 讓滑鼠可以拖動到螢屏外后,從另一邊出來
EditorGUIUtility.SetWantsMouseJumping(1);
}
break;
case EventType.MouseUp:
if (GUIUtility.hotControl == controlID)
{
GUIUtility.hotControl = 0;
}
EditorGUIUtility.SetWantsMouseJumping(0);
break;
case EventType.MouseDrag:
if (GUIUtility.hotControl == controlID)
{
// 按住 Shift 鍵后,可以加快旋轉
scrollPosition -= current.delta * (float)((!current.shift) ? 1 : 3) / Mathf.Min(position.width, position.height) * 140f;
scrollPosition.y = Mathf.Clamp(scrollPosition.y, -90f, 90f);
current.Use();
GUI.changed = true;
}
break;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/19002.html
標籤:Unity3D
上一篇:大佬們幫看看什么問題
下一篇:wordpress網站終極提速
