You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.5 KiB
C#

namespace Fusion {
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Add this Component to the NetworkRunner Prefab or GameObject. If Interest Management is enabled in NetworkProjectConfig ReplicationFeatures,
/// gizmos will be shown that indicate active Area Of Interest cells. These gizmos are currently NOT applicable to Shared Mode and will only
/// render for the Server/Host peer.
/// </summary>
[RequireComponent(typeof(NetworkRunner))]
[ScriptHelp(BackColor = ScriptHeaderBackColor.Sand)]
[DisallowMultipleComponent]
public class RunnerAOIGizmos : SimulationBehaviour {
#if UNITY_EDITOR
[Flags]
public enum GizmoOptionsEnum {
ShowActiveServerZones = 1,
ShowPlayerInterest = 2,
}
[System.Serializable]
public struct CustomOptions {
public Color ServerZonesColor;
public Color PlayerInterestColor;
}
[ExpandableEnum(AlwaysExpanded = true)]
public GizmoOptionsEnum GizmoOptions = GizmoOptionsEnum.ShowActiveServerZones | GizmoOptionsEnum.ShowPlayerInterest;
public CustomOptions Customization = new CustomOptions() {
ServerZonesColor = new Color(0.25f, 0.25f, 0.25f, 0.75f),
PlayerInterestColor = new Color(255f / 255f, 21f / 255f, 21 / 255f, 0.2f),
};
private List<(Vector3 center, Vector3 size, int playerCount, int objectCount)> _reusableGizmoData;
private void OnEnabled() {
}
private void OnDrawGizmos() {
if (enabled == false) {
return;
}
if (GizmoOptions == 0) {
return;
}
var runner = Runner;
if ((object)runner == null || runner.IsRunning == false) {
return;
}
var datas = _reusableGizmoData ??= new List<(Vector3 center, Vector3 size, int playerCount, int objectCount)>();
var colors = Customization;
runner.GetAreaOfInterestGizmoData(datas);
for (int i = 0; i < datas.Count; i++) {
var data = datas[i];
var c = datas[i].center;
var s = datas[i].size;
// Draw server actives zone boxes
if (data.objectCount > 0) {
Gizmos.color = colors.ServerZonesColor;
Gizmos.DrawWireCube(data.center, data.size);
}
// Draw player interest regions
if (data.playerCount > 0) {
Gizmos.color = colors.PlayerInterestColor;
Gizmos.DrawCube(c, s);
}
}
Gizmos.color = Color.white;
}
#endif
}
}