Untitled
unknown
plain_text
9 months ago
3.8 kB
11
Indexable
// Tạo file mới: CachedConstantHaptic.cs
using UnityEngine;
using Lofelt.NiceVibrations;
public class CachedConstantHaptic
{
private byte[] jsonClip;
private GamepadRumble gamepadRumble;
private float duration;
/// <summary>
/// Khởi tạo với duration cố định
/// </summary>
public CachedConstantHaptic(float duration)
{
this.duration = Mathf.Max(duration, 0.0f);
GenerateData();
}
private void GenerateData()
{
// Load constant template (cần access từ HapticPatterns hoặc copy template)
// Giả sử bạn có access đến constantTemplate hoặc tạo JSON trực tiếp
var constantTemplate = Resources.Load<TextAsset>("nv-constant-template")?.text;
if (constantTemplate == null)
{
Debug.LogError("Cannot load constant template");
return;
}
var numberFormat = new System.Globalization.NumberFormatInfo();
numberFormat.NumberDecimalSeparator = ".";
// Tạo JSON
string json = constantTemplate
.Replace("{duration}", duration.ToString(numberFormat));
jsonClip = System.Text.Encoding.UTF8.GetBytes(json);
// Tạo GamepadRumble
#if ((!UNITY_ANDROID && !UNITY_IOS) || UNITY_EDITOR) && NICE_VIBRATIONS_INPUTSYSTEM_INSTALLED && ENABLE_INPUT_SYSTEM && !NICE_VIBRATIONS_DISABLE_GAMEPAD_SUPPORT
int rumbleDurationMs = (int)(duration * 1000);
const int rumbleEntryDurationMs = 16;
int rumbleEntryCount = rumbleDurationMs / rumbleEntryDurationMs;
gamepadRumble = new GamepadRumble
{
durationsMs = new int[rumbleEntryCount],
lowFrequencyMotorSpeeds = new float[rumbleEntryCount],
highFrequencyMotorSpeeds = new float[rumbleEntryCount],
totalDurationMs = rumbleDurationMs
};
for (int i = 0; i < rumbleEntryCount; i++)
{
gamepadRumble.durationsMs[i] = rumbleEntryDurationMs;
gamepadRumble.lowFrequencyMotorSpeeds[i] = 1.0f;
gamepadRumble.highFrequencyMotorSpeeds[i] = 1.0f;
}
#endif
}
/// <summary>
/// Play với amplitude và frequency (duration đã được cache)
/// </summary>
public void Play(float amplitude, float frequency)
{
if (jsonClip == null || !HapticController.hapticsEnabled)
{
return;
}
float clampedAmplitude = Mathf.Clamp(amplitude, 0.0f, 1.0f);
float clampedFrequency = Mathf.Clamp(frequency, 0.0f, 1.0f);
if (HapticController.Init() || GamepadRumbler.IsConnected())
{
#if ((!UNITY_ANDROID && !UNITY_IOS) || UNITY_EDITOR) && NICE_VIBRATIONS_INPUTSYSTEM_INSTALLED && ENABLE_INPUT_SYSTEM && !NICE_VIBRATIONS_DISABLE_GAMEPAD_SUPPORT
HapticController.Load(jsonClip, gamepadRumble);
#else
HapticController.Load(jsonClip);
#endif
HapticController.Loop(false);
HapticController.clipLevel = clampedAmplitude;
HapticController.clipFrequencyShift = clampedFrequency;
HapticController.Play();
}
else if (DeviceCapabilities.isVersionSupported)
{
#if (UNITY_ANDROID && !UNITY_EDITOR)
float[] patternTime = new float[] { 0.0f, duration };
LofeltHaptics.PlayMaximumAmplitudePattern(patternTime);
#elif (UNITY_IOS && !UNITY_EDITOR)
HapticPatterns.PlayPreset(HapticPatterns.PresetType.HeavyImpact);
#endif
}
}
}
// Sử dụng:
// CachedConstantHaptic cachedHaptic = new CachedConstantHaptic(0.5f); // Duration = 0.5s
// cachedHaptic.Play(0.8f, 0.5f); // Amplitude = 0.8, Frequency = 0.5Editor is loading...
Leave a Comment