151 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace Fusion.Addons.KCC
 | |
| {
 | |
| 	using System;
 | |
| 	using UnityEngine;
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// Base settings for <c>KCC</c>, can be modified at runtime.
 | |
| 	/// </summary>
 | |
| 	[Serializable]
 | |
| 	public sealed partial class KCCSettings
 | |
| 	{
 | |
| 		// CONSTANTS
 | |
| 
 | |
| 		public static readonly int   MaxNestedStages                 = 32;
 | |
| 		public static readonly float ExtrapolationDeltaTimeThreshold = 0.00005f;
 | |
| 
 | |
| 		// PUBLIC MEMBERS
 | |
| 
 | |
| 		[Header("Networked Settings")]
 | |
| 
 | |
| 		[Tooltip("Defines KCC physics behavior. This property is networked.\n" +
 | |
| 		"• None - Skips internal physics query, collider is despawned.\n" +
 | |
| 		"• Capsule - Full physics processing, Capsule collider spawned.")]
 | |
| 		public EKCCShape Shape = EKCCShape.Capsule;
 | |
| 
 | |
| 		[Tooltip("Sets collider isTrigger. This property is networked.")]
 | |
| 		public bool IsTrigger = false;
 | |
| 
 | |
| 		[Tooltip("Sets collider radius. This property is networked.")]
 | |
| 		public float Radius = 0.35f;
 | |
| 
 | |
| 		[Tooltip("Sets collider height. This property is networked.")]
 | |
| 		public float Height = 1.8f;
 | |
| 
 | |
| 		[Tooltip("Defines additional radius extent for ground detection and processors tracking. Recommended range is 10-20% of radius. This property is networked.\n" +
 | |
| 		"• Low value decreases stability and has potential performance impact when executing additional checks.\n" +
 | |
| 		"• High value increases stability at the cost of increased sustained performance impact.")]
 | |
| 		public float Extent = 0.035f;
 | |
| 
 | |
| 		[Tooltip("Sets layer of collider game object. This property is networked.")]
 | |
| 		[KCCLayer]
 | |
| 		public int ColliderLayer = 0;
 | |
| 
 | |
| 		[Tooltip("Layer mask the KCC collides with. This property is networked.")]
 | |
| 		public LayerMask CollisionLayerMask = 1;
 | |
| 
 | |
| 		[Tooltip("Default KCC features. This property is networked.")]
 | |
| 		public EKCCFeatures Features = EKCCFeatures.All;
 | |
| 
 | |
| 		[Tooltip("Defines update behavior for KCC with input authority. This has priority over State Authority Behavior. This property is networked.\n" +
 | |
| 		"• Predict Fixed | Interpolate Render - Full processing/prediction in fixed update, interpolation between last two predicted fixed update states in render update.\n" +
 | |
| 		"• Predict Fixed | Predict Render - Full processing/prediction in fixed update, full processing/prediction in render update.")]
 | |
| 		public EKCCAuthorityBehavior InputAuthorityBehavior = EKCCAuthorityBehavior.PredictFixed_InterpolateRender;
 | |
| 
 | |
| 		[Tooltip("Defines update behavior for KCC with state authority. This property is networked.\n" +
 | |
| 		"• Predict Fixed | Interpolate Render - Full processing/prediction in fixed update, interpolation between last two predicted fixed update states in render update.\n" +
 | |
| 		"• Predict Fixed | Predict Render - Full processing/prediction in fixed update, full processing/prediction in render update.")]
 | |
| 		public EKCCAuthorityBehavior StateAuthorityBehavior = EKCCAuthorityBehavior.PredictFixed_InterpolateRender;
 | |
| 
 | |
| 		[Tooltip("Defines interpolation behavior. Proxies predicted in fixed update are always fully interpolated. This property is networked.\n" +
 | |
| 		"• Full - Interpolates all networked properties in KCCSettings and KCCData, synchronizes Transform and Rigidbody components everytime interpolation is triggered.\n" +
 | |
| 		"• Transform - Interpolates only position and rotation and synchronizes Transform component. This mode is fastest, but most KCCSettings and KCCData properties won't be synchronized. Use with caution!")]
 | |
| 		public EKCCInterpolationMode ProxyInterpolationMode = EKCCInterpolationMode.Full;
 | |
| 
 | |
| 		[Tooltip("Forces render prediction of look rotation for input authority. Can be used for extra look responsiveness with other properties being interpolated. This property is networked.")]
 | |
| 		public bool ForcePredictedLookRotation = false;
 | |
| 
 | |
| 		[Tooltip("Allows input authority to call Teleport RPC. Use with caution. This property is networked.")]
 | |
| 		public bool AllowClientTeleports = false;
 | |
| 
 | |
| 		[Header("Local Settings")]
 | |
| 
 | |
| 		[KCCProcessorReference][Tooltip("Default processors, propagated to KCC.LocalProcessors upon initialization. This property is not networked.")]
 | |
| 		public UnityEngine.Object[] Processors;
 | |
| 
 | |
| 		[Tooltip("Penetration in single move step is corrected in multiple steps which results in higher overall depenetration quality. This property is not networked.")]
 | |
| 		[Range(1, 16)]
 | |
| 		public int MaxPenetrationSteps = 8;
 | |
| 
 | |
| 		[Tooltip("Controls maximum distance the KCC moves in a single CCD step. Valid range is 10% - 90% of the radius. Use lower values if the character passes through geometry.\n" +
 | |
| 		"This setting is valid only when EKCCFeature.CCD is enabled. CCD Max Step Distance = Radius * CCD Radius Multiplier. This property is not networked.")]
 | |
| 		[Range(0.1f, 0.9f)]
 | |
| 		public float CCDRadiusMultiplier = 0.75f;
 | |
| 
 | |
| 		[Tooltip("Defines render position distance tolerance to smooth out jitter. Higher values may introduce noticeable delay when switching move direction. This property is not networked.\n" +
 | |
| 		"• X = Horizontal axis.\n" +
 | |
| 		"• Y = Vertical axis.")]
 | |
| 		public Vector2 AntiJitterDistance = new Vector2(0.025f, 0.01f);
 | |
| 
 | |
| 		[Tooltip("How fast prediction error interpolates towards zero. This property is not networked.")]
 | |
| 		public float PredictionCorrectionSpeed = 30.0f;
 | |
| 
 | |
| 		[Tooltip("Maximum interactions synchronized over network. Includes Collisions, Modifiers and Ignores from KCCData. This property is not networked.")]
 | |
| 		public int NetworkedInteractions = 8;
 | |
| 
 | |
| 		[Tooltip("Reduces network traffic by synchronizing compressed position at the cost of precision. Useful for non-player characters. This property is not networked.")]
 | |
| 		public bool CompressNetworkPosition = false;
 | |
| 
 | |
| 		[Tooltip("Perform single overlap query during move. Hits are tracked on position before depenetration. This is a performance optimization for non-player characters at the cost of possible errors in movement. This property is not networked.")]
 | |
| 		public bool ForceSingleOverlapQuery = false;
 | |
| 
 | |
| 		[Tooltip("Enable to always check collisions against non-convex mesh colliders to prevent ghost collisions and incorrect penetration vectors. This property is not networked.")]
 | |
| 		public bool SuppressConvexMeshColliders = false;
 | |
| 
 | |
| 
 | |
| 		// PUBLIC METHODS
 | |
| 
 | |
| 		public void CopyFromOther(KCCSettings other)
 | |
| 		{
 | |
| 			Shape                       = other.Shape;
 | |
| 			IsTrigger                   = other.IsTrigger;
 | |
| 			Radius                      = other.Radius;
 | |
| 			Height                      = other.Height;
 | |
| 			Extent                      = other.Extent;
 | |
| 			ColliderLayer               = other.ColliderLayer;
 | |
| 			CollisionLayerMask          = other.CollisionLayerMask;
 | |
| 			Features                    = other.Features;
 | |
| 			InputAuthorityBehavior      = other.InputAuthorityBehavior;
 | |
| 			StateAuthorityBehavior      = other.StateAuthorityBehavior;
 | |
| 			ProxyInterpolationMode      = other.ProxyInterpolationMode;
 | |
| 			ForcePredictedLookRotation  = other.ForcePredictedLookRotation;
 | |
| 			AllowClientTeleports        = other.AllowClientTeleports;
 | |
| 
 | |
| 			if (other.Processors != null && other.Processors.Length > 0)
 | |
| 			{
 | |
| 				Processors = new UnityEngine.Object[other.Processors.Length];
 | |
| 				Array.Copy(other.Processors, Processors, Processors.Length);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				Processors = null;
 | |
| 			}
 | |
| 
 | |
| 			MaxPenetrationSteps         = other.MaxPenetrationSteps;
 | |
| 			CCDRadiusMultiplier         = other.CCDRadiusMultiplier;
 | |
| 			AntiJitterDistance          = other.AntiJitterDistance;
 | |
| 			PredictionCorrectionSpeed   = other.PredictionCorrectionSpeed;
 | |
| 			NetworkedInteractions       = other.NetworkedInteractions;
 | |
| 			CompressNetworkPosition     = other.CompressNetworkPosition;
 | |
| 			ForceSingleOverlapQuery     = other.ForceSingleOverlapQuery;
 | |
| 			SuppressConvexMeshColliders = other.SuppressConvexMeshColliders;
 | |
| 
 | |
| 			CopyUserSettingsFromOther(other);
 | |
| 		}
 | |
| 
 | |
| 		// PARTIAL METHODS
 | |
| 
 | |
| 		partial void CopyUserSettingsFromOther(KCCSettings other);
 | |
| 	}
 | |
| }
 |