|
|
|
|
@@ -0,0 +1,284 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using Dreamteck.Splines;
|
|
|
|
|
using Ichni.Editor;
|
|
|
|
|
using Ichni.RhythmGame.Beatmap;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace Ichni.RhythmGame
|
|
|
|
|
{
|
|
|
|
|
public partial class ObjectTracker : GameElement
|
|
|
|
|
{
|
|
|
|
|
public Track track;
|
|
|
|
|
public ObjectController objectController;
|
|
|
|
|
public GameObject objectPrefab;
|
|
|
|
|
private List<string> themeBundleList;
|
|
|
|
|
private List<string> objectNameList;
|
|
|
|
|
public string themeBundleName;
|
|
|
|
|
public string objectName;
|
|
|
|
|
|
|
|
|
|
public float playTime;
|
|
|
|
|
public float stopTime;
|
|
|
|
|
|
|
|
|
|
public int spawnCount;
|
|
|
|
|
public Vector2 positionOffsetMin = Vector2.zero;
|
|
|
|
|
public Vector2 positionOffsetMax = Vector2.zero;
|
|
|
|
|
public string customPositionRuleName;
|
|
|
|
|
|
|
|
|
|
public bool applyRotationOffset = false;
|
|
|
|
|
public Vector3 rotationOffsetMin = Vector3.zero;
|
|
|
|
|
public Vector3 rotationOffsetMax = Vector3.zero;
|
|
|
|
|
public string customRotationRuleName;
|
|
|
|
|
|
|
|
|
|
public bool applyScaleOffset = false;
|
|
|
|
|
public Vector3 scaleOffsetMin = Vector3.one;
|
|
|
|
|
public Vector3 scaleOffsetMax = Vector3.one;
|
|
|
|
|
public string customScaleRuleName;
|
|
|
|
|
|
|
|
|
|
public static ObjectTracker GenerateElement(string elementName, Guid id, List<string> tags,
|
|
|
|
|
bool isFirstGenerated, Track track, string themeBundleName, string objectName, int spawnCount,
|
|
|
|
|
Vector2 positionOffsetMin, Vector2 positionOffsetMax, string customPositionRuleName,
|
|
|
|
|
bool applyRotationOffset, Vector3 rotationOffsetMin, Vector3 rotationOffsetMax, string customRotationRuleName,
|
|
|
|
|
bool applyScaleOffset, Vector3 scaleOffsetMin, Vector3 scaleOffsetMax, string customScaleRuleName)
|
|
|
|
|
{
|
|
|
|
|
ObjectTracker objectTracker = Instantiate(EditorManager.instance.basePrefabs.objectTracker, track.transform).GetComponent<ObjectTracker>();
|
|
|
|
|
objectTracker.objectPrefab = ThemeBundleManager.instance.GetObject<GameObject>(themeBundleName, objectName);
|
|
|
|
|
|
|
|
|
|
objectTracker.objectController.objects = new[] { objectTracker.objectPrefab };
|
|
|
|
|
objectTracker.Initialize(elementName, id, tags, isFirstGenerated, track);
|
|
|
|
|
objectTracker.track = track;
|
|
|
|
|
objectTracker.objectController.spline = track.trackPathSubmodule.path;
|
|
|
|
|
objectTracker.themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
|
|
|
|
|
objectTracker.objectNameList = new List<string>();
|
|
|
|
|
objectTracker.themeBundleName = themeBundleName;
|
|
|
|
|
objectTracker.objectName = objectName;
|
|
|
|
|
objectTracker.SetSpawnSettings(spawnCount,
|
|
|
|
|
positionOffsetMin, positionOffsetMax, customPositionRuleName,
|
|
|
|
|
applyRotationOffset, rotationOffsetMin, rotationOffsetMax, customRotationRuleName,
|
|
|
|
|
applyScaleOffset, scaleOffsetMin, scaleOffsetMax, customScaleRuleName);
|
|
|
|
|
return objectTracker;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Update()
|
|
|
|
|
{
|
|
|
|
|
float songTime = EditorManager.instance.songInformation.songTime;
|
|
|
|
|
if (playTime > songTime || stopTime < songTime)
|
|
|
|
|
{
|
|
|
|
|
if (objectController.enabled)
|
|
|
|
|
{
|
|
|
|
|
objectController.enabled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!objectController.enabled)
|
|
|
|
|
{
|
|
|
|
|
objectController.enabled = true;
|
|
|
|
|
objectController.Spawn();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void SetUpInspector()
|
|
|
|
|
{
|
|
|
|
|
base.SetUpInspector();
|
|
|
|
|
|
|
|
|
|
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
|
|
|
|
|
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
|
|
|
|
|
var container = inspector.GenerateContainer("Object Tracker");
|
|
|
|
|
var generate = container.GenerateSubcontainer(3);
|
|
|
|
|
var themeBundleDropdown =
|
|
|
|
|
inspector.GenerateDropdown(this, generate, "Theme Bundle", themeBundleList, nameof(themeBundleName))
|
|
|
|
|
.AddListenerFunction(() => inspectorMain.SetInspector(this));
|
|
|
|
|
if (themeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(themeBundleName, out ThemeBundle themeBundle))
|
|
|
|
|
{
|
|
|
|
|
objectNameList = themeBundle.assetList_GameObject.ConvertAll(x => x.name);
|
|
|
|
|
var objectNameDropdown =
|
|
|
|
|
inspector.GenerateDropdown(this, generate, "Object Name", objectNameList, nameof(objectName))
|
|
|
|
|
.AddListenerFunction(() => inspectorMain.SetInspector(this));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var objectNameDropdown =
|
|
|
|
|
inspector.GenerateDropdown(this, generate, "Object Name", new List<string>(), nameof(objectName));
|
|
|
|
|
objectNameDropdown.dropdown.interactable = false;
|
|
|
|
|
} // 如果没有选择主题包,则物体名称下拉框不可用
|
|
|
|
|
|
|
|
|
|
var setButton = inspector.GenerateButton(this, generate, "Generate", () =>
|
|
|
|
|
{
|
|
|
|
|
this.objectPrefab = ThemeBundleManager.instance.GetObject<GameObject>(themeBundleName, objectName);
|
|
|
|
|
this.objectController.objects = new[] { this.objectPrefab };
|
|
|
|
|
this.objectController.Spawn();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (themeBundleName == String.Empty || objectName == String.Empty)
|
|
|
|
|
{
|
|
|
|
|
setButton.button.interactable = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var spawnSettings = container.GenerateSubcontainer(3);
|
|
|
|
|
inspector.GenerateInputField(this, spawnSettings, "Spawn Count", nameof(spawnCount))
|
|
|
|
|
.AddListenerFunction(()=> objectController.spawnCount = spawnCount);
|
|
|
|
|
inspector.GenerateInputField(this, spawnSettings, "Play Time", nameof(playTime));
|
|
|
|
|
inspector.GenerateInputField(this, spawnSettings, "Stop Time", nameof(stopTime));
|
|
|
|
|
var posSettings = container.GenerateSubcontainer(1);
|
|
|
|
|
inspector.GenerateVector2InputField(this, posSettings, "Position Offset Min", nameof(positionOffsetMin))
|
|
|
|
|
.AddListenerFunction(()=> objectController.minOffset = positionOffsetMin);
|
|
|
|
|
inspector.GenerateVector2InputField(this, posSettings, "Position Offset Max", nameof(positionOffsetMax))
|
|
|
|
|
.AddListenerFunction(()=> objectController.maxOffset = positionOffsetMax);
|
|
|
|
|
//inspector.GenerateInputField(this, posSettings, "Custom Position Rule Name", nameof(customPositionRuleName));
|
|
|
|
|
var rotSettings = container.GenerateSubcontainer(1);
|
|
|
|
|
inspector.GenerateToggle(this, rotSettings, "Apply Rotation Offset", nameof(applyRotationOffset))
|
|
|
|
|
.AddListenerFunction(()=> objectController.applyRotation = applyRotationOffset);
|
|
|
|
|
inspector.GenerateVector3InputField(this, rotSettings, "Rotation Offset Min", nameof(rotationOffsetMin))
|
|
|
|
|
.AddListenerFunction(()=> objectController.minRotation = rotationOffsetMin);
|
|
|
|
|
inspector.GenerateVector3InputField(this, rotSettings, "Rotation Offset Max", nameof(rotationOffsetMax))
|
|
|
|
|
.AddListenerFunction(()=> objectController.maxRotation = rotationOffsetMax);
|
|
|
|
|
//inspector.GenerateInputField(this, rotSettings, "Custom Rotation Rule Name", nameof(customRotationRuleName));
|
|
|
|
|
var scaleSettings = container.GenerateSubcontainer(1);
|
|
|
|
|
inspector.GenerateToggle(this, scaleSettings, "Apply Scale Offset", nameof(applyScaleOffset))
|
|
|
|
|
.AddListenerFunction(()=> objectController.applyScale = applyScaleOffset);
|
|
|
|
|
inspector.GenerateVector3InputField(this, scaleSettings, "Scale Offset Min", nameof(scaleOffsetMin))
|
|
|
|
|
.AddListenerFunction(()=> objectController.minScaleMultiplier = scaleOffsetMin);
|
|
|
|
|
inspector.GenerateVector3InputField(this, scaleSettings, "Scale Offset Max", nameof(scaleOffsetMax))
|
|
|
|
|
.AddListenerFunction(()=> objectController.maxScaleMultiplier = scaleOffsetMax);
|
|
|
|
|
//inspector.GenerateInputField(this, scaleSettings, "Custom Scale Rule Name", nameof(customScaleRuleName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void SaveBM()
|
|
|
|
|
{
|
|
|
|
|
matchedBM = new Beatmap.ObjectTracker_BM(elementName, elementGuid, tags,
|
|
|
|
|
parentElement.matchedBM as GameElement_BM,
|
|
|
|
|
themeBundleName, objectName,
|
|
|
|
|
playTime, stopTime,
|
|
|
|
|
spawnCount,
|
|
|
|
|
positionOffsetMin, positionOffsetMax, customPositionRuleName,
|
|
|
|
|
applyRotationOffset, rotationOffsetMin, rotationOffsetMax, customRotationRuleName,
|
|
|
|
|
applyScaleOffset, scaleOffsetMin, scaleOffsetMax, customScaleRuleName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public partial class ObjectTracker
|
|
|
|
|
{
|
|
|
|
|
public void SetSpawnSettings(int spawnCount,
|
|
|
|
|
Vector2 positionOffsetMin, Vector2 positionOffsetMax, string customPositionRuleName,
|
|
|
|
|
bool applyRotationOffset, Vector3 rotationOffsetMin, Vector3 rotationOffsetMax, string customRotationRuleName,
|
|
|
|
|
bool applyScaleOffset, Vector3 scaleOffsetMin, Vector3 scaleOffsetMax, string customScaleRuleName)
|
|
|
|
|
{
|
|
|
|
|
this.spawnCount = spawnCount;
|
|
|
|
|
this.positionOffsetMin = positionOffsetMin;
|
|
|
|
|
this.positionOffsetMax = positionOffsetMax;
|
|
|
|
|
this.customPositionRuleName = customPositionRuleName;
|
|
|
|
|
this.applyRotationOffset = applyRotationOffset;
|
|
|
|
|
this.rotationOffsetMin = rotationOffsetMin;
|
|
|
|
|
this.rotationOffsetMax = rotationOffsetMax;
|
|
|
|
|
this.customRotationRuleName = customRotationRuleName;
|
|
|
|
|
this.applyScaleOffset = applyScaleOffset;
|
|
|
|
|
this.scaleOffsetMin = scaleOffsetMin;
|
|
|
|
|
this.scaleOffsetMax = scaleOffsetMax;
|
|
|
|
|
this.customScaleRuleName = customScaleRuleName;
|
|
|
|
|
|
|
|
|
|
objectController.spawnCount = spawnCount;
|
|
|
|
|
objectController.minOffset = positionOffsetMin;
|
|
|
|
|
objectController.maxOffset = positionOffsetMax;
|
|
|
|
|
|
|
|
|
|
objectController.applyRotation = applyRotationOffset;
|
|
|
|
|
objectController.minRotation = rotationOffsetMin;
|
|
|
|
|
objectController.maxRotation = rotationOffsetMax;
|
|
|
|
|
|
|
|
|
|
objectController.applyScale = applyScaleOffset;
|
|
|
|
|
objectController.minScaleMultiplier = scaleOffsetMin;
|
|
|
|
|
objectController.maxScaleMultiplier = scaleOffsetMax;
|
|
|
|
|
|
|
|
|
|
objectController.Spawn();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace Beatmap
|
|
|
|
|
{
|
|
|
|
|
public class ObjectTracker_BM : GameElement_BM
|
|
|
|
|
{
|
|
|
|
|
public string themeBundleName;
|
|
|
|
|
public string objectName;
|
|
|
|
|
|
|
|
|
|
public float playTime;
|
|
|
|
|
public float stopTime;
|
|
|
|
|
|
|
|
|
|
public int spawnCount;
|
|
|
|
|
public Vector2 positionOffsetMin;
|
|
|
|
|
public Vector2 positionOffsetMax;
|
|
|
|
|
public string customPositionRuleName;
|
|
|
|
|
|
|
|
|
|
public bool applyRotationOffset;
|
|
|
|
|
public Vector3 rotationOffsetMin;
|
|
|
|
|
public Vector3 rotationOffsetMax;
|
|
|
|
|
public string customRotationRuleName;
|
|
|
|
|
|
|
|
|
|
public bool applyScaleOffset;
|
|
|
|
|
public Vector3 scaleOffsetMin;
|
|
|
|
|
public Vector3 scaleOffsetMax;
|
|
|
|
|
public string customScaleRuleName;
|
|
|
|
|
|
|
|
|
|
public ObjectTracker_BM()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ObjectTracker_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
|
|
|
|
string themeBundleName, string objectName,
|
|
|
|
|
float playTime, float stopTime,
|
|
|
|
|
int spawnCount,
|
|
|
|
|
Vector2 positionOffsetMin, Vector2 positionOffsetMax, string customPositionRuleName,
|
|
|
|
|
bool applyRotationOffset, Vector3 rotationOffsetMin, Vector3 rotationOffsetMax, string customRotationRuleName,
|
|
|
|
|
bool applyScaleOffset, Vector3 scaleOffsetMin, Vector3 scaleOffsetMax, string customScaleRuleName)
|
|
|
|
|
: base(elementName, elementGuid, tags, attachedElement)
|
|
|
|
|
{
|
|
|
|
|
this.themeBundleName = themeBundleName;
|
|
|
|
|
this.objectName = objectName;
|
|
|
|
|
|
|
|
|
|
this.playTime = playTime;
|
|
|
|
|
this.stopTime = stopTime;
|
|
|
|
|
|
|
|
|
|
this.spawnCount = spawnCount;
|
|
|
|
|
this.positionOffsetMin = positionOffsetMin;
|
|
|
|
|
this.positionOffsetMax = positionOffsetMax;
|
|
|
|
|
this.customPositionRuleName = customPositionRuleName;
|
|
|
|
|
|
|
|
|
|
this.applyRotationOffset = applyRotationOffset;
|
|
|
|
|
this.rotationOffsetMin = rotationOffsetMin;
|
|
|
|
|
this.rotationOffsetMax = rotationOffsetMax;
|
|
|
|
|
this.customRotationRuleName = customRotationRuleName;
|
|
|
|
|
|
|
|
|
|
this.applyScaleOffset = applyScaleOffset;
|
|
|
|
|
this.scaleOffsetMin = scaleOffsetMin;
|
|
|
|
|
this.scaleOffsetMax = scaleOffsetMax;
|
|
|
|
|
this.customScaleRuleName = customScaleRuleName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void ExecuteBM()
|
|
|
|
|
{
|
|
|
|
|
matchedElement = ObjectTracker.GenerateElement(
|
|
|
|
|
elementName, elementGuid, tags, false,
|
|
|
|
|
GetElement(attachedElementGuid) as Track,
|
|
|
|
|
themeBundleName, objectName,
|
|
|
|
|
spawnCount,
|
|
|
|
|
positionOffsetMin, positionOffsetMax, customPositionRuleName,
|
|
|
|
|
applyRotationOffset, rotationOffsetMin, rotationOffsetMax, customRotationRuleName,
|
|
|
|
|
applyScaleOffset, scaleOffsetMin, scaleOffsetMax, customScaleRuleName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override GameElement DuplicateBM(GameElement attached)
|
|
|
|
|
{
|
|
|
|
|
return ObjectTracker.GenerateElement(
|
|
|
|
|
elementName, Guid.NewGuid(), new List<string>(tags), false,
|
|
|
|
|
attached as Track,
|
|
|
|
|
themeBundleName, objectName,
|
|
|
|
|
spawnCount,
|
|
|
|
|
positionOffsetMin, positionOffsetMax, customPositionRuleName,
|
|
|
|
|
applyRotationOffset, rotationOffsetMin, rotationOffsetMax, customRotationRuleName,
|
|
|
|
|
applyScaleOffset, scaleOffsetMin, scaleOffsetMax, customScaleRuleName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|