Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 27 additions & 9 deletions PlateauToolkit.Sandbox/Editor/PlateauSandboxContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ class PlateauSandboxContext
{
static PlateauSandboxContext s_Current;

readonly List<PlateauSandboxTrack> m_Tracks = new();
// 最初にアクセスするまで生成を遅延する(後方互換の為)
List<PlateauSandboxTrack> m_Tracks = null;
readonly PlacementSettings m_PlacementSettings = new();
GameObject m_SelectedObject;

//複数選択
List<GameObject> m_SelectedObjects;
public List<GameObject> SelectedObjectsMultiple { get => m_SelectedObjects; }
public List<GameObject> SelectedObjectsMultiple { get => m_SelectedObjects; }

public UnityEvent<GameObject> OnSelectedObjectChanged { get; } = new UnityEvent<GameObject>();

Expand All @@ -26,23 +27,40 @@ public IReadOnlyList<PlateauSandboxTrack> Tracks
get
{
// TODO: Managing lifecycles of objects is the best way.
if (m_Tracks == null || IsAnyTrackDestroyed)
{
RefreshArrays(ref m_Tracks);
}

return m_Tracks;
}
}

/// <summary>
/// m_Tracksの中に破棄されたものがあるかどうかを返す
/// </summary>
public bool IsAnyTrackDestroyed
{
get
{
if (m_Tracks == null)
return false;

foreach (PlateauSandboxTrack track in m_Tracks)
{
if (track == null)
{
RefreshArrays(m_Tracks);
break;
}
return true;
}

return m_Tracks;
return false;
}
}

public PlacementSettings PlacementSettings => m_PlacementSettings;

static void RefreshArrays<T>(List<T> list) where T : Component
static void RefreshArrays<T>(ref List<T> list) where T : Component
{
list ??= new();
list.Clear();

Scene activeScene = SceneManager.GetActiveScene();
Expand Down Expand Up @@ -155,7 +173,7 @@ public void Refresh()

public void RefreshTracks()
{
RefreshArrays(m_Tracks);
RefreshArrays(ref m_Tracks);
}
}

Expand Down
65 changes: 63 additions & 2 deletions PlateauToolkit.Sandbox/Editor/PlateauSandboxWindowTrackView.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using PlateauToolkit.Editor;
using System;
using System.Linq;
using UnityEditor;
using UnityEditor.EditorTools;
Expand All @@ -21,9 +22,66 @@ public void OnBegin(PlateauSandboxContext context, EditorWindow editorWindow)
RefreshTracksHierarchy(context);
}

/// <summary>
/// KnotPlacementToolの終了判定用
/// </summary>
private Type LastToolType { get; set; }

/// <summary>
/// 新規トラック作成で作成されたトラック
/// </summary>
private PlateauSandboxTrack SelectedTrack { get; set; }

/// <summary>
/// ToolManager.activeToolType切り替えコールバック
/// </summary>
void OnActiveToolChanged()
{
// KnotPlacementToolがinternalクラスでアクセスできないので名前ハードコーディング
// KnotPlacementToolが終わった時に, 対象のTrackにknotsが無ければキャンセル扱いで破棄する
if (LastToolType.Name == "KnotPlacementTool")
{
if (SelectedTrack && SelectedTrack.GetKnotsCount() == 0)
{
// ↓でSelectedTrack初期化しているので一時変数に入れる
var tmp = SelectedTrack;
EditorApplication.delayCall += () =>
{
GameObject.DestroyImmediate(tmp.gameObject);
};
}
ToolManager.activeToolChanged -= OnActiveToolChanged;
SelectedTrack = null;
}

LastToolType = ToolManager.activeToolType;
}

/// <summary>
/// ToolManagerのactiveToolTypeの切り替え検知開始
/// </summary>
/// <param name="selectedTrack"></param>
void StartToolChangeNotifier(PlateauSandboxTrack selectedTrack)
{
SelectedTrack = selectedTrack;
LastToolType = ToolManager.activeToolType;
ToolManager.activeToolChanged += OnActiveToolChanged;
}


public void OnGUI(PlateauSandboxContext context, EditorWindow window)
{
PlateauToolkitEditorGUILayout.Header("ツール");

// ヒエラルキーで直接破壊したとき用.
// Trackが外部から破壊されたときには表示を更新する
if (context.IsAnyTrackDestroyed)
{
EditorApplication.delayCall += () =>
{
RefreshTracksHierarchy(context);
};
}
using (new EditorGUILayout.VerticalScope())
{
if (ToolManager.activeToolType.Name != "KnotPlacementTool")
Expand All @@ -35,17 +93,20 @@ public void OnGUI(PlateauSandboxContext context, EditorWindow window)
{
string gameObjectName = GameObjectUtility.GetUniqueNameForSibling(null, "Track");
GameObject trackGameObject = ObjectFactory.CreateGameObject(gameObjectName, typeof(PlateauSandboxTrack));

trackGameObject.transform.localPosition = Vector3.zero;
trackGameObject.transform.localRotation = Quaternion.identity;

StartToolChangeNotifier(trackGameObject.GetComponent<PlateauSandboxTrack>());
Selection.activeObject = trackGameObject;
ActiveEditorTracker.sharedTracker.RebuildIfNecessary();
EditorApplication.delayCall += () =>
{
EditorSplineUtility.SetKnotPlacementTool();
RefreshTracksHierarchy(context);
};

// EndLayoutGroup: BeginLayoutGroup must be called first.が出ないようにする対策
GUIUtility.ExitGUI();
}
}
else
Expand Down Expand Up @@ -86,6 +147,7 @@ public void OnGUI(PlateauSandboxContext context, EditorWindow window)
}
}
}

EditorGUILayout.Space(15);

m_TreeView.OnGUI(EditorGUILayout.GetControlRect(false, 200));
Expand Down Expand Up @@ -150,7 +212,6 @@ void SetUpTreeView()
},
})),
};

var headerState = new MultiColumnHeaderState(m_HierarchyContext.Hierarchy.Header.Columns);
var header = new MultiColumnHeader(headerState);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,13 @@ public override void OnInspectorGUI()
manager.UpdateTrafficLightSequences();
}

EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(PlateauSandboxTrafficManager.m_EnableRightOfWays)));
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(PlateauSandboxTrafficManager.m_ShowTrafficLightGizmos)));

serializedObject.ApplyModifiedProperties();

//Runtime時にRightOfWays(交差点での判定処理)を行わないフラグ
PlateauSandboxTrafficManagerConstants.USE_RIGHT_OF_WAYS_ON_RUNTIME = serializedObject.FindProperty(nameof(PlateauSandboxTrafficManager.m_EnableRightOfWays)).boolValue;
}
}
}
33 changes: 33 additions & 0 deletions PlateauToolkit.Sandbox/Runtime/PlateauSandboxCameraManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,5 +215,38 @@ void CheckCameraTarget(Vector3 screenPosition)
m_CurrentCameraController = new(
m_CameraSettings, m_CameraPivot, cameraTarget, PlateauSandboxCameraMode.FirstPersonView);
}

public void SetCameraTarget(Collider targetCollider)
{
if (targetCollider == null)
{
return;
}

if (!PlateauSandboxObjectFinder.TryGetSandboxObject(targetCollider, out IPlateauSandboxPlaceableObject sandboxObject))
{
return;
}

if (sandboxObject is not IPlateauSandboxCameraTarget cameraTarget)
{
return;
}

if (!cameraTarget.IsCameraViewAvailable)
{
return;
}

if (Camera.main == null)
{
return;
}
m_LastMainCamera = Camera.main;
m_LastMainCamera.enabled = false;
m_SubCamera.enabled = true;
m_CurrentCameraController = new(
m_CameraSettings, m_CameraPivot, cameraTarget, PlateauSandboxCameraMode.FirstPersonView);
}
}
}
2 changes: 1 addition & 1 deletion PlateauToolkit.Sandbox/Runtime/PlateauSandboxHuman.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public void OnMoveBegin()

public void OnMove(in MovementInfo movementInfo, PlateauSandboxTrack track)
{
(Vector3 position, Vector3 forward) = track.GetPositionAndForwardBySplineContainerT(movementInfo.m_SplineContainerT);
(Vector3 position, Vector3 forward) = track.GetPositionAndForwardBySplineContainerT(movementInfo.m_SplineContainerT, movementInfo.m_PositionOffset);
m_Speed = movementInfo.m_MoveDelta / Time.deltaTime;

Quaternion toRotation = Quaternion.LookRotation(forward, Vector3.up);
Expand Down
15 changes: 13 additions & 2 deletions PlateauToolkit.Sandbox/Runtime/PlateauSandboxTrack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -273,20 +273,31 @@ public float GetNearestPoint(Vector3 position, out Vector3 nearestPoint, out int
}

public Vector3 GetPositionBySplineContainerT(float splineContainerT)
{
return GetPositionBySplineContainerT(splineContainerT, Vector3.zero);
}

public Vector3 GetPositionBySplineContainerT(float splineContainerT, Vector3 positionOffset)
{
(int splineIndex, float t) = GetSplineIndex(splineContainerT);

Spline spline = SplineContainer[splineIndex];
return transform.TransformPoint(spline.EvaluatePosition(t));
return transform.TransformPoint(spline.EvaluatePosition(t)) + positionOffset;
}


public (Vector3, Vector3) GetPositionAndForwardBySplineContainerT(float splineContainerT)
{
return GetPositionAndForwardBySplineContainerT(splineContainerT, Vector3.zero);
}

public (Vector3, Vector3) GetPositionAndForwardBySplineContainerT(float splineContainerT, Vector3 positionOffset)
{
(int splineIndex, float t) = GetSplineIndex(splineContainerT);

Spline spline = SplineContainer[splineIndex];
return (
transform.TransformPoint(spline.EvaluatePosition(t)),
transform.TransformPoint(spline.EvaluatePosition(t)) + positionOffset,
transform.TransformDirection(spline.EvaluateTangent(t)).normalized);
}

Expand Down
24 changes: 17 additions & 7 deletions PlateauToolkit.Sandbox/Runtime/PlateauSandboxTrackMovement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public struct MovementInfo
public float m_Velocity;
public float m_MoveDelta;
public float m_SplineContainerT;
public Vector3 m_PositionOffset;
public Vector3 m_LookaheadForward;
public Vector3 m_SecondAxisPoint;
public Vector3 m_SecondAxisForward;
Expand Down Expand Up @@ -189,17 +190,23 @@ internal void ApplyPosition()
return;
}

(Vector3 position, Vector3 forward) = m_Track.GetPositionAndForwardBySplineContainerT(m_SplineContainerT);

// Apply the offset.
position += transform.right * m_TrackOffset.x;
position += transform.up * m_TrackOffset.y;
position += transform.forward * m_TrackOffset.z;
Vector3 trackOffset = CalcTrackOffset(transform, m_TrackOffset);
(Vector3 position, Vector3 forward) = m_Track.GetPositionAndForwardBySplineContainerT(m_SplineContainerT, trackOffset);

m_MovingObject.SetPosition(position);
transform.rotation = Quaternion.LookRotation(forward, Vector3.up);
}

internal static Vector3 CalcTrackOffset(Transform transform, Vector3 trackOffset)
{
Vector3 position = Vector3.zero;
position += transform.right * trackOffset.x;
position += transform.up * trackOffset.y;
position += transform.forward * trackOffset.z;
return position;
}

public bool TrySetSplineContainerT(float t)
{
if (IsMoving)
Expand Down Expand Up @@ -329,17 +336,20 @@ IEnumerator RandomWalkEnumerator()
}

m_SplineContainerT = t;
Vector3 positionOffset = CalcTrackOffset(transform, m_TrackOffset);

MovementInfo movementInfo;
movementInfo.m_SplineContainerT = t;
movementInfo.m_PositionOffset = positionOffset;


float secondAxisDistance = m_MovingObject.SecondAxisDistance;
if (secondAxisDistance > 0)
{
randomWalkPathIterator.Clone()
.MoveByLinearDistance(secondAxisDistance, out float secondAxisT);
(movementInfo.m_SecondAxisPoint, movementInfo.m_SecondAxisForward) =
m_Track.GetPositionAndForwardBySplineContainerT(secondAxisT);
m_Track.GetPositionAndForwardBySplineContainerT(secondAxisT, positionOffset);
}
else
{
Expand All @@ -350,7 +360,7 @@ IEnumerator RandomWalkEnumerator()
// Get an interpolation value of the collision detection point.
randomWalkPathIterator.Clone()
.MovePoint(Mathf.Max(m_CurrentVelocity, m_MinCollisionDetectDistance), out float collisionT);
Vector3 collisionPoint = m_Track.GetPositionBySplineContainerT(collisionT);
Vector3 collisionPoint = m_Track.GetPositionBySplineContainerT(collisionT, positionOffset);

m_CollisionPoint = collisionPoint + m_MovingObject.TransformUp * m_CollisionDetectHeight;

Expand Down
2 changes: 1 addition & 1 deletion PlateauToolkit.Sandbox/Runtime/PlateauSandboxVehicle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ float IPlateauSandboxMovingObject.GetVelocityRatio(float lookaheadAngle)
public void OnMove(in MovementInfo movementInfo, PlateauSandboxTrack track)
{
// Align the object to the spline.
Vector3 position = track.GetPositionBySplineContainerT(movementInfo.m_SplineContainerT);
Vector3 position = track.GetPositionBySplineContainerT(movementInfo.m_SplineContainerT, movementInfo.m_PositionOffset);

// Set the position first.
SetPosition(position);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ public LightingSequence(float intervalSec, GroupLightingOrder[] groupLightingOrd
this.groupLightingOrders = groupLightingOrders;
}

public void SetIntervalSec(float val)
{
intervalSec = val;
}

[SerializeField] float intervalSec;
[SerializeField] GroupLightingOrder[] groupLightingOrders;
}
Expand Down
Loading