去掉obi,使用自写绳索
This commit is contained in:
@@ -1,213 +0,0 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Obi{
|
||||
|
||||
/**
|
||||
* Custom inspector for ObiParticleRenderer component.
|
||||
*/
|
||||
|
||||
[CustomEditor(typeof(ObiRopeSection))]
|
||||
public class ObiRopeSectionEditor : Editor
|
||||
{
|
||||
|
||||
ObiRopeSection section;
|
||||
bool[] selected = new bool[0];
|
||||
|
||||
Color previewBck = new Color(0.2f,0.2f,0.2f,1);
|
||||
Color previewLines = new Color(0.15f,0.15f,0.15f,1);
|
||||
|
||||
public void OnEnable(){
|
||||
section = (ObiRopeSection)target;
|
||||
}
|
||||
|
||||
public override bool HasPreviewGUI(){
|
||||
return true;
|
||||
}
|
||||
|
||||
private void ResetSelection(){
|
||||
selected = new bool[section.Segments];
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
|
||||
serializedObject.UpdateIfRequiredOrScript();
|
||||
|
||||
Editor.DrawPropertiesExcluding(serializedObject,"m_Script");
|
||||
|
||||
GUI.enabled = !EditorApplication.isPlaying;
|
||||
GUILayout.Label("Presets");
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("4-segment circle")){
|
||||
Undo.RecordObject(section, "Set rope section preset");
|
||||
section.CirclePreset(4);
|
||||
ResetSelection();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("8-segment circle")){
|
||||
Undo.RecordObject(section, "Set rope section preset");
|
||||
section.CirclePreset(8);
|
||||
ResetSelection();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("12-segment circle")){
|
||||
Undo.RecordObject(section, "Set rope section preset");
|
||||
section.CirclePreset(12);
|
||||
ResetSelection();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("16-segment circle")){
|
||||
Undo.RecordObject(section, "Set rope section preset");
|
||||
section.CirclePreset(16);
|
||||
ResetSelection();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.Label("Tools");
|
||||
if (GUILayout.Button("Add vertex")){
|
||||
Undo.RecordObject(section, "Add rope vertex");
|
||||
section.vertices.Add(Vector2.zero);
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Remove selected vertices")){
|
||||
Undo.RecordObject(section, "Remove rope vertices");
|
||||
for (int i = selected.Length-1; i > 0; --i){
|
||||
if (selected[i] && section.vertices.Count > 3)
|
||||
section.vertices.RemoveAt(i);
|
||||
}
|
||||
// special cases: first vertex:
|
||||
if (selected[0] && section.vertices.Count > 3){
|
||||
section.vertices.RemoveAt(0);
|
||||
section.vertices[section.vertices.Count-1] = section.vertices[0];
|
||||
}
|
||||
|
||||
ResetSelection();
|
||||
}
|
||||
GUI.enabled = true;
|
||||
|
||||
// Apply changes to the serializedProperty
|
||||
if (GUI.changed){
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
EditorUtility.SetDirty(target);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void DrawSectionOutline(Rect region, Color color){
|
||||
// Draw segment lines:
|
||||
Handles.BeginGUI( );
|
||||
Color oldColor = Handles.color;
|
||||
Handles.color = color;
|
||||
Vector3[] points = new Vector3[section.vertices.Count];
|
||||
for (int i = 0; i < section.vertices.Count; i++){
|
||||
points[i] = new Vector3(region.center.x + section.vertices[i].x * region.width * 0.5f,
|
||||
region.center.y + section.vertices[i].y * region.height * 0.5f,0);
|
||||
}
|
||||
Handles.DrawAAPolyLine(points);
|
||||
Handles.EndGUI();
|
||||
Handles.color = oldColor;
|
||||
}
|
||||
|
||||
private void DrawDrawingArea(Rect region){
|
||||
// Draw drawing area grid:
|
||||
Handles.BeginGUI();
|
||||
Handles.DrawSolidRectangleWithOutline(region,previewBck,previewLines);
|
||||
|
||||
Color oldColor = Handles.color;
|
||||
Handles.color = previewLines;
|
||||
|
||||
if (section.snapX > 5){
|
||||
float x = region.center.x;
|
||||
while (x < region.xMax){
|
||||
Handles.DrawLine(new Vector3(x,region.yMin,0),new Vector3(x,region.yMax,0));
|
||||
x += section.snapX;
|
||||
}
|
||||
x = region.center.x - section.snapX;
|
||||
while (x > region.xMin){
|
||||
Handles.DrawLine(new Vector3(x,region.yMin,0),new Vector3(x,region.yMax,0));
|
||||
x -= section.snapX;
|
||||
}
|
||||
}
|
||||
|
||||
if (section.snapY > 5){
|
||||
float y = region.center.y;
|
||||
while (y < region.yMax){
|
||||
Handles.DrawLine(new Vector3(region.xMin,y,0),new Vector3(region.xMax,y,0));
|
||||
y += section.snapY;
|
||||
}
|
||||
y = region.center.y - section.snapY;
|
||||
while (y > region.yMin){
|
||||
Handles.DrawLine(new Vector3(region.xMin,y,0),new Vector3(region.xMax,y,0));
|
||||
y -= section.snapY;
|
||||
}
|
||||
}
|
||||
|
||||
Handles.color = oldColor;
|
||||
Handles.EndGUI();
|
||||
}
|
||||
|
||||
public override void OnPreviewGUI(Rect region, GUIStyle background)
|
||||
{
|
||||
DrawSectionOutline(region, Color.red);
|
||||
}
|
||||
|
||||
public override void OnInteractivePreviewGUI(Rect region, GUIStyle background)
|
||||
{
|
||||
Array.Resize(ref selected,section.Segments);
|
||||
|
||||
// Calculate drawing area rect:
|
||||
Vector2 oldCenter = region.center;
|
||||
if (region.width > region.height)
|
||||
region.width = region.height;
|
||||
if (region.height > region.width)
|
||||
region.height = region.width;
|
||||
|
||||
region.width -= 10;
|
||||
region.height -= 15;
|
||||
|
||||
region.center = oldCenter;
|
||||
|
||||
// Draw background and lines:
|
||||
DrawDrawingArea(region);
|
||||
|
||||
// Draw the section outline:
|
||||
DrawSectionOutline(region, Color.white);
|
||||
|
||||
// Draw all draggable vertices:
|
||||
for (int i = 0; i < section.Segments; i++){
|
||||
|
||||
float x = region.center.x + section.vertices[i].x * region.width * 0.5f;
|
||||
float y = region.center.y + section.vertices[i].y * region.height * 0.5f;
|
||||
Vector2 pos = new Vector2(x,y);
|
||||
|
||||
bool oldSelection = selected[i];
|
||||
Vector2 olsPos = pos;
|
||||
selected[i] = ObiDraggableIcon.Draw(selected[i],i,ref pos,Color.red);
|
||||
|
||||
if (selected[i] != oldSelection)
|
||||
this.Repaint();
|
||||
|
||||
if (pos != olsPos){
|
||||
|
||||
pos.x = Mathf.Clamp(ObiRopeSection.SnapTo(pos.x - region.center.x,section.snapX,5) / (region.width * 0.5f),-1,1);
|
||||
pos.y = Mathf.Clamp(ObiRopeSection.SnapTo(pos.y - region.center.y,section.snapY,5) / (region.height * 0.5f),-1,1);
|
||||
section.vertices[i] = pos;
|
||||
if (i == 0)
|
||||
section.vertices[section.Segments] = pos;
|
||||
|
||||
EditorUtility.SetDirty(target);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user