VRTK3.3.0版本脚本简析

VRTK_HeadsetFade脚本简析(VRTK_v3.3.0

2019-04-10  本文已影响0人  HMY轩园

此脚本作用是持续时间内将眼镜的视图颜色更改为指定的颜色;
在场景区域周围有碰撞的墙壁时,如果用户将头部插入墙壁,则视图会褪色为指定的颜色,一般选黑色;
PlayArea对象上挂在此脚本;
命名空间:VRTK

HeadsetFadeEventArgs 结构体

眼镜淡出事件参数 此处是结构体包含两个参数:
public float timeTillComplete;// 时间
public Transform currentTransform;//当前对象Camera

委托:

public delegate void HeadsetFadeEventHandler(object sender, HeadsetFadeEventArgs e); 眼镜淡出事件处理的委托 参数有发出者,上述结构体参数

事件:

对应上述委托四个事件
public event HeadsetFadeEventHandler HeadsetFadeStart; //当用户的头戴式设备开始褪色到特定颜色时发出。
public event HeadsetFadeEventHandler HeadsetFadeComplete;//当用户的头戴式设备完成淡入淡出并且现在完全处于给定颜色时发出。
public event HeadsetFadeEventHandler HeadsetUnfadeStart;//当用户的耳机开始恢复到透明颜色时发出。
public event HeadsetFadeEventHandler HeadsetUnfadeComplete;//当用户的头戴式设备完成非透明设置并再次完全透明时发出。

三个用到的字段:

protected Transform headset;//头部
protected bool isTransitioning = false;
protected bool isFaded = false;

 public virtual void OnHeadsetFadeStart(HeadsetFadeEventArgs e)
    {
        if (HeadsetFadeStart != null)
        {
            HeadsetFadeStart(this, e);
        }
    }

    public virtual void OnHeadsetFadeComplete(HeadsetFadeEventArgs e)
    {
        if (HeadsetFadeComplete != null)
        {
            HeadsetFadeComplete(this, e);
        }
    }

    public virtual void OnHeadsetUnfadeStart(HeadsetFadeEventArgs e)
    {
        if (HeadsetUnfadeStart != null)
        {
            HeadsetUnfadeStart(this, e);
        }
    }

    public virtual void OnHeadsetUnfadeComplete(HeadsetFadeEventArgs e)
    {
        if (HeadsetUnfadeComplete != null)
        {
            HeadsetUnfadeComplete(this, e);
        }
    }

上述是处理四个事件的方法,可以进行重写;

IsFaded()方法返回isFaded 的bool值,如果当前正在褪色或已经完全褪色,返回true,如果完全未褪色返回false;
IsTransitioning()方法返回isTransitioning 的bool值,如果眼镜当前正在褪色或不褪色返回真,如果眼镜视野完全褪色或未褪色返回假;
Fade(Color color, float duration)方法:在给定的持续时间duration内将耳机视图的颜色更改为给定的颜色color;
Unfade(float duration)方法:在给定的时间内将颜色更改为透明颜色。

余下方法是protected修饰的,脚本内部调用的;

Awake() 调用VRTK_SDKManager类里的一个Add方法
OnEnable() 给三个参数赋初始值和 调用VRTK_SharedMethods类的一个AddCameraFade方法;
OnDestroy() 调用VRTK_SDKManager类里的一个Remove方法,和Awake相呼应;
SetHeadsetFadeEvent方法:返回上面定义的一个枚举;
FadeComplete()方法:Fade和UnFade里调用;
UnfadeComplete()方法:Fade和UnFade里调用;

 // Headset Fade|Presence|70020
namespace VRTK
{
 using UnityEngine;
/// <summary>
/// Event Payload
/// </summary>
/// <param name="timeTillComplete">A float that is the duration for the fade/unfade process has remaining.</param>
/// <param name="currentTransform">The current Transform of the object that the Headset Fade script is attached to (Camera).</param>
public struct HeadsetFadeEventArgs
{
    public float timeTillComplete;
    public Transform currentTransform;
}

/// <summary>
/// Event Payload
/// </summary>
/// <param name="sender">this object</param>
/// <param name="e"><see cref="HeadsetFadeEventArgs"/></param>
public delegate void HeadsetFadeEventHandler(object sender, HeadsetFadeEventArgs e);

/// <summary>
/// Provides the ability to change the colour of the headset view to a specified colour over a given duration.
/// </summary>
/// <remarks>
/// **Script Usage:**
///  * Place the `VRTK_HeadsetFade` script on any active scene GameObject.
/// </remarks>
/// <example>
/// `VRTK/Examples/011_Camera_HeadSetCollisionFading` has collidable walls around the play area and if the user puts their head into any of the walls then the headset will fade to black.
/// </example>
[AddComponentMenu("VRTK/Scripts/Presence/VRTK_HeadsetFade")]
public class VRTK_HeadsetFade : MonoBehaviour
{
    /// <summary>
    /// Emitted when the user's headset begins to fade to a given colour.
    /// </summary>
    public event HeadsetFadeEventHandler HeadsetFadeStart;
    /// <summary>
    /// Emitted when the user's headset has completed the fade and is now fully at the given colour.
    /// </summary>
    public event HeadsetFadeEventHandler HeadsetFadeComplete;
    /// <summary>
    /// Emitted when the user's headset begins to unfade back to a transparent colour.
    /// </summary>
    public event HeadsetFadeEventHandler HeadsetUnfadeStart;
    /// <summary>
    /// Emitted when the user's headset has completed unfading and is now fully transparent again.
    /// </summary>
    public event HeadsetFadeEventHandler HeadsetUnfadeComplete;

    protected Transform headset;
    protected bool isTransitioning = false;
    protected bool isFaded = false;

    public virtual void OnHeadsetFadeStart(HeadsetFadeEventArgs e)
    {
        if (HeadsetFadeStart != null)
        {
            HeadsetFadeStart(this, e);
        }
    }

    public virtual void OnHeadsetFadeComplete(HeadsetFadeEventArgs e)
    {
        if (HeadsetFadeComplete != null)
        {
            HeadsetFadeComplete(this, e);
        }
    }

    public virtual void OnHeadsetUnfadeStart(HeadsetFadeEventArgs e)
    {
        if (HeadsetUnfadeStart != null)
        {
            HeadsetUnfadeStart(this, e);
        }
    }

    public virtual void OnHeadsetUnfadeComplete(HeadsetFadeEventArgs e)
    {
        if (HeadsetUnfadeComplete != null)
        {
            HeadsetUnfadeComplete(this, e);
        }
    }

    /// <summary>
    /// The IsFaded method returns true if the headset is currently fading or has completely faded and returns false if it is completely unfaded.
    /// </summary>
    /// <returns>Returns `true` if the headset is currently fading or faded.</returns>
    public virtual bool IsFaded()
    {
        return isFaded;
    }

    /// <summary>
    /// The IsTransitioning method returns true if the headset is currently fading or unfading and returns false if it is completely faded or unfaded.
    /// </summary>
    /// <returns>Returns `true` if the headset is currently in the process of fading or unfading.</returns>
    public virtual bool IsTransitioning()
    {
        return isTransitioning;
    }

    /// <summary>
    /// The Fade method initiates a change in the colour of the headset view to the given colour over a given duration.
    /// </summary>
    /// <param name="color">The colour to fade the headset view to.</param>
    /// <param name="duration">The time in seconds to take to complete the fade transition.</param>
    public virtual void Fade(Color color, float duration)//
    {
        isFaded = false;//此时为假
        isTransitioning = true;//此时为真
        VRTK_SDK_Bridge.HeadsetFade(color, duration);
        OnHeadsetFadeStart(SetHeadsetFadeEvent(headset, duration));//执行事件SetHeadsetFadeEvent(headset, duration)方法返回定义的的枚举
        CancelInvoke("UnfadeComplete");//取消UnfadeComplete方法在这个脚本中所有的调用 
        Invoke("FadeComplete", duration);// duration时间后执行FadeComplete方法
    }

    /// <summary>
    /// The Unfade method initiates the headset to change colour back to a transparent colour over a given duration.
    /// </summary>
    /// <param name="duration">The time in seconds to take to complete the unfade transition.</param>
    public virtual void Unfade(float duration)
    {
        isFaded = true;
        isTransitioning = true;
        VRTK_SDK_Bridge.HeadsetFade(Color.clear, duration);
        OnHeadsetUnfadeStart(SetHeadsetFadeEvent(headset, duration));
        CancelInvoke("FadeComplete");
        Invoke("UnfadeComplete", duration);
    }

    protected virtual void Awake()
    {
        VRTK_SDKManager.AttemptAddBehaviourToToggleOnLoadedSetupChange(this);
    }

    protected virtual void OnEnable()
    {
        headset = VRTK_DeviceFinder.HeadsetCamera();
        isTransitioning = false;
        isFaded = false;

        VRTK_SharedMethods.AddCameraFade();
    }

    protected virtual void OnDestroy()
    {
        VRTK_SDKManager.AttemptRemoveBehaviourToToggleOnLoadedSetupChange(this);
    }

    protected virtual HeadsetFadeEventArgs SetHeadsetFadeEvent(Transform currentTransform, float duration)
    {
        HeadsetFadeEventArgs e;
        e.timeTillComplete = duration;
        e.currentTransform = currentTransform;
        return e;
    }

    protected virtual void FadeComplete()
    {
        isFaded = true;//谈出完成
        isTransitioning = false;
        OnHeadsetFadeComplete(SetHeadsetFadeEvent(headset, 0f));//事件执行
    }

    protected virtual void UnfadeComplete()
    {
        isFaded = false;//恢复透明色完成
        isTransitioning = false;
        OnHeadsetUnfadeComplete(SetHeadsetFadeEvent(headset, 0f));
    }
}
}
上一篇下一篇

猜你喜欢

热点阅读