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); | ||
|  | 	} | ||
|  | } |