private IEnumerator SpawnAndMoveAndDestroy(RhythmPatternEvent e) { float x = Mathf.Lerp(-1.5f, 1.5f, e.position.x); float y = Mathf.Lerp(2.5f, 0, e.position.y); GameObject instantiatePrefab = e.hand == RhythmPatternEvent.Hand.Right ? rightPrefab : leftPrefab; GameObject go = Instantiate(instantiatePrefab); go.transform.parent = transform; switch (e.side) { case RhythmPatternEvent.Side.Any: int RandomDir = UnityEngine.Random.Range(0, 2); float rotation = -90; if (RandomDir == 1) { rotation = 90; } go.transform.Rotate(go.transform.forward, rotation); break; case RhythmPatternEvent.Side.Right: go.transform.Rotate(go.transform.forward, -90); break; case RhythmPatternEvent.Side.Bottom: go.transform.Rotate(go.transform.forward, 180); break; case RhythmPatternEvent.Side.Left: go.transform.Rotate(go.transform.forward, 90); break; } Vector3 targetPos = Vector3.zero + Vector3.right * x; float offset = RhythmTracker.instance.GetOffset(); float elapsedTime = 0; while (elapsedTime <= offset) { float t = Mathf.InverseLerp(0, offset, elapsedTime); float inverseT = Mathf.InverseLerp(offset, 0, elapsedTime); Vector3 currentPos = targetPos + Vector3.up * y * curve.Evaluate(t) + Vector3.forward * 30 * inverseT; go.transform.position = currentPos; elapsedTime += Time.unscaledDeltaTime; yield return(new WaitForEndOfFrame()); } while (elapsedTime < offset + 1) { go.transform.position = Vector3.Lerp(targetPos + Vector3.up * y, targetPos - Vector3.forward * 10, Mathf.InverseLerp(offset, offset + 1, elapsedTime)); elapsedTime += Time.unscaledDeltaTime; yield return(new WaitForEndOfFrame()); } Destroy(go); }
void OnGUI() { EditorGUILayout.BeginVertical(); source = EditorGUILayout.ObjectField(source, typeof(RhythmPattern), false, GUILayout.MaxWidth(600)); if (source) { RhythmPattern sourcePattern = (RhythmPattern)source; if (sourcePattern.events.Count != sourcePattern.steps * sourcePattern.rows) { sourcePattern.InitializeList(); } RhythmTracker.TriggerTiming timing = sourcePattern.timing; sourcePattern.timing = (RhythmTracker.TriggerTiming)EditorGUILayout.EnumPopup(("Timing"), timing, GUILayout.MaxWidth(600)); int offset = sourcePattern.offset; sourcePattern.offset = EditorGUILayout.IntField("Offset", offset, GUILayout.MaxWidth(600)); string[] labels = new string[sourcePattern.steps * sourcePattern.rows]; Texture2D[] textures = new Texture2D[sourcePattern.steps * sourcePattern.rows]; GUIContent[] contents = new GUIContent[sourcePattern.steps * sourcePattern.rows]; for (int i = 0; i < contents.Length; i++) { Color handColor; if (i > sourcePattern.steps - 1) { sourcePattern.events[i].hand = RhythmPatternEvent.Hand.Right; handColor = Color.red; } else { sourcePattern.events[i].hand = RhythmPatternEvent.Hand.Left; handColor = Color.blue; } labels[i] = (i % sourcePattern.steps + offset).ToString(); textures[i] = new Texture2D(5, 10); Color[] colorArray = textures[i].GetPixels(); Color stateColor; if (sourcePattern.events[i].side == RhythmPatternEvent.Side.None) { stateColor = Color.gray; } else { stateColor = handColor; } for (int j = 0; j < colorArray.Length; j++) { colorArray[j] = stateColor; } textures[i].SetPixels(colorArray); contents[i] = new GUIContent(labels[i], textures[i]); } selected = GUILayout.SelectionGrid(selected, contents, sourcePattern.steps); RhythmPatternEvent patternEvent = sourcePattern.events[selected]; int.TryParse(labels[selected], out patternEvent.hitIndex); float plotXSliderValue = patternEvent.position.x; float plotYSliderValue = patternEvent.position.y; RhythmPatternEvent.Side side = patternEvent.side; Texture2D XY = new Texture2D(200, 200); Color[] resetColorArray = XY.GetPixels(); for (int i = 0; i < resetColorArray.Length; i++) { resetColorArray[i] = Color.black; } XY.SetPixels(resetColorArray); XY.Apply(); EditorGUI.DrawPreviewTexture(new Rect(10, 110, 200, 200), XY); Texture2D pos = new Texture2D(10, 10); Color[] resetColorArrayPos = pos.GetPixels(); for (int i = 0; i < resetColorArrayPos.Length; i++) { resetColorArrayPos[i] = Color.white; } pos.SetPixels(resetColorArrayPos); pos.Apply(); plotXSliderValue = EditorGUI.Slider(new Rect(10, 320, 200, 20), plotXSliderValue, 0, 1); plotYSliderValue = EditorGUI.Slider(new Rect(10, 340, 200, 20), plotYSliderValue, 0, 1); EditorGUI.DrawPreviewTexture(new Rect(Mathf.RoundToInt(Mathf.Lerp(10, 200, plotXSliderValue)), Mathf.RoundToInt(Mathf.Lerp(110, 300, plotYSliderValue)), 10, 10), pos); patternEvent.position.x = plotXSliderValue; patternEvent.position.y = plotYSliderValue; GUILayout.BeginArea(new Rect(10, 370, 200, 20)); patternEvent.side = (RhythmPatternEvent.Side)EditorGUILayout.EnumPopup(("Side"), side, GUILayout.Width(200)); GUILayout.EndArea(); EditorGUILayout.EndVertical(); } }