Untitled

 avatar
unknown
plain_text
9 months ago
3.8 kB
13
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.5
Editor is loading...
Leave a Comment