VRTK_HeadsetCollisionFade腳本簡析(VRTK_v3.3.0版)

當(dāng)檢測到眼鏡即Camera的碰撞事件時,啟動眼鏡視圖的淡入淡出。
PlayArea對象上掛在此腳本;

參數(shù):

    public float timeTillFade = 0f;//等待淡入的時間
    public float blinkTransitionSpeed = 0.1f;//碰撞時的閃爍速度
    public Color fadeColor = Color.black;//指定顏色
    public VRTK_PolicyList targetListPolicy;//類
    public VRTK_HeadsetCollision headsetCollision;    //類   
    public VRTK_HeadsetFade headsetFade;//類

protected修飾的方法:

OnEnable()
獲取這兩個類:headsetFade headsetCollision
headsetCollision注冊兩個事件
OnDisable()
headsetCollision移除兩個事件

事件綁定的方法:

OnHeadsetCollisionDetect(): 里面執(zhí)行 Invoke("StartFade", timeTillFade);
OnHeadsetCollisionEnded(): 里面執(zhí)行CancelInvoke("StartFade");
headsetFade.Unfade(blinkTransitionSpeed);

StartFade() 開始顏色變黑,調(diào)用的VRTK_HeadsetFade類里的Fade方法
ValidTarget() 返回bool值,判斷碰撞后是否需要顏色變黑

    // Headset Collision Fade|Presence|70030
     namespace VRTK
   {
  using UnityEngine;
/// <summary>
/// Initiates a fade of the headset view when a headset collision event is detected.
/// </summary>
/// <remarks>
/// **Required Components:**
///  * `VRTK_HeadsetCollision` - A Headset Collision script to determine when the HMD has collided with valid geometry.
///  * `VRTK_HeadsetFade` - A Headset Fade script to alter the visible colour on the HMD view.
///
/// **Script Usage:**
///  * Place the `VRTK_HeadsetCollisionFade` 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_HeadsetCollisionFade")]
public class VRTK_HeadsetCollisionFade : MonoBehaviour
{
    [Header("Collision Fade Settings")]

    [Tooltip("The amount of time to wait until a fade occurs.")]
    public float timeTillFade = 0f;//等待淡入的時間
    [Tooltip("The fade blink speed on collision.")]
    public float blinkTransitionSpeed = 0.1f;//碰撞時的閃爍速度
    [Tooltip("The colour to fade the headset to on collision.")]
    public Color fadeColor = Color.black;//碰撞后的顏色
    [Tooltip("A specified VRTK_PolicyList to use to determine whether any objects will be acted upon by the Headset Collision Fade.")]
    public VRTK_PolicyList targetListPolicy;//指定的VRTK_PolicyList類,用于確定耳機沖突是否會對任何對象起作用

    [Header("Custom Settings")]

    [Tooltip("The VRTK Headset Collision script to use when determining headset collisions. If this is left blank then the script will need to be applied to the same GameObject.")]
    public VRTK_HeadsetCollision headsetCollision;//確定耳機碰撞的類 determining headset collisions
    [Tooltip("The VRTK Headset Fade script to use when fading the headset. If this is left blank then the script will need to be applied to the same GameObject.")]
    public VRTK_HeadsetFade headsetFade;//負責(zé)褪色的類

    protected virtual void OnEnable()
    {
        headsetFade = (headsetFade != null ? headsetFade : FindObjectOfType<VRTK_HeadsetFade>());
        headsetCollision = (headsetCollision != null ? headsetCollision : FindObjectOfType<VRTK_HeadsetCollision>());

        if (headsetFade == null)
        {
            VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "VRTK_HeadsetCollisionFade", "VRTK_HeadsetFade", "the same or child"));
            return;
        }

        if (headsetCollision == null)
        {
            VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "VRTK_HeadsetCollisionFade", "VRTK_HeadsetCollision", "the same or child"));
            return;
        }

        headsetCollision.HeadsetCollisionDetect += new HeadsetCollisionEventHandler(OnHeadsetCollisionDetect);
        headsetCollision.HeadsetCollisionEnded += new HeadsetCollisionEventHandler(OnHeadsetCollisionEnded);
    }

    protected virtual void OnDisable()
    {
        if (headsetCollision != null)
        {
            headsetCollision.HeadsetCollisionDetect -= new HeadsetCollisionEventHandler(OnHeadsetCollisionDetect);
            headsetCollision.HeadsetCollisionEnded -= new HeadsetCollisionEventHandler(OnHeadsetCollisionEnded);
        }
    }

    protected virtual void OnHeadsetCollisionDetect(object sender, HeadsetCollisionEventArgs e)
    {
        if (ValidTarget(e.collider))
        {
            Invoke("StartFade", timeTillFade);
        }
    }

    protected virtual void OnHeadsetCollisionEnded(object sender, HeadsetCollisionEventArgs e)
    {
        if (ValidTarget(e.collider))
        {
            CancelInvoke("StartFade");
            headsetFade.Unfade(blinkTransitionSpeed);
        }
    }

    protected virtual void StartFade()
    {
        headsetFade.Fade(fadeColor, blinkTransitionSpeed);
    }

    protected virtual bool ValidTarget(Collider target)
    {
        return (target != null && !(VRTK_PolicyList.Check(target.gameObject, targetListPolicy)));
    }
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容