void CalcNavLines() { if (!m_exec) { return; } NavLines gen = target as NavLines; serializedObject.Update(); int resolution = gen.resolution; float resolutionRate = 1.0f / resolution; if (gen.Edit_GetPointerCount() >= 4) { Queue <Vector3> que = new Queue <Vector3>(); SerializedProperty loopPoint = serializedObject.FindProperty("m_loopPoint"); SerializedProperty waitPoint = serializedObject.FindProperty("m_tableWaitPoint"); SerializedProperty waitTime = serializedObject.FindProperty("m_tableWaitTime"); waitPoint.ClearArray(); waitTime.ClearArray(); int idxWaitPoint = 0; int idx = 0; loopPoint.intValue = -1; System.Func <Vector3> funcNameless = () => { Transform transBasis = gen.transform.GetChild(idx); NavLinePointer pointer = transBasis.GetComponent <NavLinePointer>(); if (pointer != null) { if (pointer.isLoop) { loopPoint.intValue = idx; } } else { NavLineWaitPointer csWait = transBasis.GetComponent <NavLineWaitPointer>(); if (csWait != null) { waitPoint.InsertArrayElementAtIndex(idxWaitPoint); waitTime.InsertArrayElementAtIndex(idxWaitPoint); waitPoint.GetArrayElementAtIndex(idxWaitPoint).intValue = (idx - 1).MinLimitedZero() * resolution; waitTime.GetArrayElementAtIndex(idxWaitPoint).floatValue = csWait.waitTime; ++idxWaitPoint; } } ++idx; return(transBasis.transform.position); }; Vector3 v0 = funcNameless.Invoke(); Vector3 v1 = funcNameless.Invoke(); Vector3 v2 = funcNameless.Invoke(); Vector3 v = Vector3.zero; System.Action <float> nameless = (s) => { float s2 = s * s; float s3 = s2 * s; float f0 = ((-s3) + (2.0f * s2) - (s)); float f1 = ((3.0f * s3) - (5.0f * s2) + (2.0f)); float f2 = ((-3.0f * s3) + (4.0f * s2) + (s)); float f3 = ((s3) - (s2)); Vector3 vec = Vector3.zero; vec.x = ((f0 * v0.x) + (f1 * v1.x) + (f2 * v2.x) + (f3 * v.x)) * 0.50f; vec.z = ((f0 * v0.z) + (f1 * v1.z) + (f2 * v2.z) + (f3 * v.z)) * 0.50f; vec.y = gen.lineViewHeight; que.Enqueue(vec); }; System.Action namelessCardinal = () => { for (int k = 0; k < resolution; ++k) { nameless.Invoke(resolutionRate * k); } v0 = v1; v1 = v2; v2 = v; }; for (; idx < gen.transform.childCount;) { Transform trans = gen.transform.GetChild(idx); NavLinePointer cs = trans.GetComponent <NavLinePointer>(); if (cs != null) { if (cs.isLoop) { loopPoint.intValue = idx; } } else { NavLineWaitPointer csWait = trans.GetComponent <NavLineWaitPointer>(); if (csWait != null) { waitPoint.InsertArrayElementAtIndex(idxWaitPoint); waitTime.InsertArrayElementAtIndex(idxWaitPoint); waitPoint.GetArrayElementAtIndex(idxWaitPoint).intValue = (idx - 1).MinLimitedZero() * resolution; waitTime.GetArrayElementAtIndex(idxWaitPoint).floatValue = csWait.waitTime; ++idxWaitPoint; } } ++idx; v = trans.transform.position; namelessCardinal.Invoke(); } serializedObject.ApplyModifiedProperties(); if (gen.isLoop) { v = gen.transform.GetChild(gen.loopPoint).transform.position; namelessCardinal.Invoke(); } namelessCardinal.Invoke(); nameless.Invoke(0.0f); gen.table = new Vector3[que.Count]; LineRenderer render = gen.transform.GetChild(0).GetComponent <LineRenderer>(); render.SetVertexCount(que.Count); Vector3 prev = que.Peek(); float sumDistance = 0.0f; int n = 0; foreach (Vector3 vec in que) { Vector3 commit = vec; sumDistance += Vector3.Distance(vec, prev); commit.y = sumDistance; prev = vec; render.SetPosition(n, vec); gen.table[n] = commit; ++n; } } else { Debug.LogError("EditNavLines: NavPointerが4つ以上必要です。"); } }
public override void OnInspectorGUI() { NavLines gen = target as NavLines; serializedObject.Update(); EditorGUILayout.HelpBox("y = 合計の距離", MessageType.Info); bool bn = EditorGUILayout.Toggle("自動更新:" + (m_exec ? "実行中" : "停止中"), m_exec); if (m_exec != bn) { m_exec = bn; if (m_exec) { EditorApplication.update += CalcNavLines; } else { EditorApplication.update -= CalcNavLines; } } SerializedProperty resolution = serializedObject.FindProperty("m_resolution"); SerializedProperty lineViewHeight = serializedObject.FindProperty("m_lineViewHeight"); resolution.intValue = EditorGUILayout.IntSlider("分割数", resolution.intValue, 1, 16); lineViewHeight.floatValue = EditorGUILayout.FloatField("線を表示する高さ", lineViewHeight.floatValue); m_collapsed = EditorGUILayout.Foldout(m_collapsed, "NavPointer情報"); if (m_collapsed) { { EditorGUILayout.LabelField("座標情報"); EditorGUILayout.BeginVertical(); int idx = 0; foreach (Vector3 vec in gen.table) { EditorGUI.indentLevel++; EditorGUILayout.Vector3Field(idx.ToString(), vec); EditorGUI.indentLevel--; ++idx; } EditorGUILayout.EndVertical(); } EditorGUILayout.Space(); { EditorGUILayout.LabelField("WaitPoint情報"); EditorGUILayout.BeginVertical(); int idx = 0; if ((gen.waitPoint != null) && (gen.waitPoint.Length != 0)) { for (int i = 0; i < gen.waitPoint.Length; ++i) { EditorGUI.indentLevel++; EditorGUILayout.LabelField(idx.ToString()); EditorGUILayout.IntField("Index", gen.waitPoint[i]); EditorGUILayout.FloatField("Time", gen.waitTime[i]); EditorGUI.indentLevel--; ++idx; } } else { EditorGUILayout.HelpBox("停止点を設定していません", MessageType.Info); } EditorGUILayout.EndVertical(); } } serializedObject.ApplyModifiedProperties(); }