VR游乐园关键代码

UI界面控制

1.CountDownCanvas

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CountDownCanvas : MonoBehaviour
{
    public static CountDownCanvas Instance;

    private Text txt_CountDown;
    private int m_Time = 3;

    private void Awake()
    {
        Instance = this;
        txt_CountDown = transform.Find("txt_CountDown").GetComponent<Text>();
        gameObject.SetActive(false);
    }
    public void ReduceTime()
    {
        if (m_Time > 0)
        {
            gameObject.SetActive(true);
            txt_CountDown.text = m_Time.ToString();
            m_Time--;
        }
    }
}

2.GameItemSelectPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameItemSelectPanel : MonoBehaviour
{
    private Button btn_Forward;
    private Button btn_Back;
    private Button btn_Select;
    private Text txt_Title;

    private string[] m_GameItemNameArr;

    private void Awake()
    {
        ReadGameItemNameText();
        Init();
    }
    private void Update()
    {
        txt_Title.text = m_GameItemNameArr[GameItemSpawn.Instance.Index];
    }
    private void ReadGameItemNameText()
    {
        TextAsset textAsset = Resources.Load<TextAsset>("游乐项目名字");
        m_GameItemNameArr = textAsset.text.Split('\n');
    }
    private void Init()
    {
        txt_Title = transform.Find("txt_Title").GetComponent<Text>();

        btn_Forward = transform.Find("btn_Forward").GetComponent<Button>();
        btn_Forward.onClick.AddListener(() =>
        {
            GameItemSpawn.Instance.RotateForward();
        });
        btn_Back = transform.Find("btn_Back").GetComponent<Button>();
        btn_Back.onClick.AddListener(() =>
        {
            GameItemSpawn.Instance.RotateBack();
        });
        btn_Select = transform.Find("btn_Select").GetComponent<Button>();
        btn_Select.onClick.AddListener(() =>
        {
            LoadingPanel.Instance.LoadScene();
        });
    }
}

3.LoadingPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LoadingPanel : MonoBehaviour
{
    public static LoadingPanel Instance;

    private Image img_LoadingBar;
    private AsyncOperation m_Ao;
    private bool m_IsLoad = false;

    private void Awake()
    {
        Instance = this;
        transform.localScale = Vector3.zero;
        img_LoadingBar = transform.Find("img_LoadingBar").GetComponent<Image>();
    }
    public void LoadScene()
    {
        transform.DOScale(Vector3.one, 0.3f).OnComplete(() =>
        {
            StartCoroutine("Load");
        });
    }
    IEnumerator Load()
    {
        int displayProgress = -1;
        int toProgress = 100;

        while (displayProgress < toProgress)
        {
            displayProgress++;
            ShowProgress(displayProgress); 

            if (m_IsLoad == false)
            {
                m_Ao = SceneManager.LoadSceneAsync(2 + GameItemSpawn.Instance.Index);
                m_Ao.allowSceneActivation = false;
                m_IsLoad = true;
            }
            yield return new WaitForEndOfFrame();
        }
        if (displayProgress == 100)
        {
            m_Ao.allowSceneActivation = true;
            StopCoroutine("Load");
        }
    }
    private void ShowProgress(int progress)
    {
        img_LoadingBar.fillAmount = progress * 0.01f;
    }
}

4.StartScene

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class StartScene : MonoBehaviour
{
    private Button btn_Start;
    private Button btn_Exit;

    private void Awake()
    {
        btn_Start = transform.Find("btn_Start").GetComponent<Button>();
        btn_Start.onClick.AddListener(() =>
        {
            SceneManager.LoadScene(1);
        });

        btn_Exit = transform.Find("btn_Exit").GetComponent<Button>();
        btn_Exit.onClick.AddListener(OnExitButtonClick);
    }
    private void OnExitButtonClick()
    {
        Application.Quit();
    }
}

5.AnimController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AnimController : MonoBehaviour
{
    public AudioSource m_CheersAudio;

    private Animation m_Anim;
    /// <summary>
    /// 动画片段的时间
    /// </summary>
    private float m_ClipTime;
    /// <summary>
    /// 是否播放欢呼音效
    /// </summary>
    private bool m_IsPlayCheersAudio = false;
    /// <summary>
    /// 动画是否播放完
    /// </summary>
    private bool m_IsEnd = false;
    /// <summary>
    /// 计时器
    /// </summary>
    private float m_Timer = 0f;

    private void Awake()
    {
        m_Anim = GetComponent<Animation>();
        m_ClipTime = m_Anim.clip.length;
    }
    private void Update()
    {
        m_ClipTime -= Time.deltaTime;
        if (m_ClipTime <= 10 && m_IsPlayCheersAudio == false)
        {
            m_CheersAudio.Play();
            m_IsPlayCheersAudio = true;
        }
        if (m_ClipTime <= 0 && m_IsEnd == false)
        {
            UnityEngine.XR.InputTracking.disablePositionalTracking = false;
            SceneManager.LoadScene("MainScene");
            m_IsEnd = true;
        }
        if (m_ClipTime <= 4)
        {
            m_Timer += Time.deltaTime;
            if (m_Timer >= 1)
            {
                m_Timer = 0;
                CountDownCanvas.Instance.ReduceTime();
            }
        }
    }
}

6.DisablePositionTracking

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DisablePositionTracking : MonoBehaviour
{
    public Vector3 pos;

    private void Awake()
    {
        UnityEngine.XR.InputTracking.disablePositionalTracking = true;
        transform.localPosition = pos;
    }
}

7.GameItem

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using VRTK;
using System.IO;

public class GameItem : MonoBehaviour
{
    public int Index;
    private VideoPlayer m_VideoPlayer;

    private void Awake()
    {
        m_VideoPlayer = GetComponent<VideoPlayer>();
        GameObject.Find("ControllerRight").GetComponent<VRTK_ControllerEvents>().TouchpadReleased += GameItem_TouchpadReleased;
        GameObject.Find("ControllerLeft").GetComponent<VRTK_ControllerEvents>().TouchpadReleased += GameItem_TouchpadReleased;
    }
    private void Update()
    {
        if (Index == GameItemSpawn.Instance.Index)
        {
            GetComponent<MeshCollider>().enabled = true;
            GetComponent<MeshRenderer>().material.color = Color.white;
        }
        else
        {
            GetComponent<MeshCollider>().enabled = false;
            GetComponent<MeshRenderer>().material.color = Color.gray;
        }
    }
    /// <summary>
    /// 圆盘按钮抬起
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void GameItem_TouchpadReleased(object sender, ControllerInteractionEventArgs e)
    {
        m_VideoPlayer.Pause();
    }
    /// <summary>
    /// 设置视频名称
    /// </summary>
    /// <param name="videoName"></param>
    public void SetVideoName(string videoName)
    {
        m_VideoPlayer.url = GetVideoPath(videoName);
    }
    /// <summary>
    /// 获取视频路径
    /// </summary>
    /// <param name="videoName"></param>
    /// <returns></returns>
    private string GetVideoPath(string videoName)
    {
        return Application.dataPath + "/StreamingAssets/" + videoName + ".mp4";
    }
    private void OnTriggerEnter(Collider other)
    {
        //代表文件不存在
        if (File.Exists(m_VideoPlayer.url) == false) return;
        m_VideoPlayer.Play();
    }
    private void OnTriggerExit(Collider other)
    {
        m_VideoPlayer.Pause();
    }
}

8.GameItemSpawn

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class GameItemSpawn : MonoBehaviour
{
    public static GameItemSpawn Instance;

    public Material[] m_GameItemMatArr;
    public GameObject go_GameItem;
    public int Index = 0;

    private float m_Angle;

    private void Awake()
    {
        Instance = this;
        m_Angle = 360.0f / m_GameItemMatArr.Length;
        for (int i = 0; i < m_GameItemMatArr.Length; i++)
        {
            GameObject go = Instantiate(go_GameItem, transform);
            go.transform.localEulerAngles = new Vector3(0, i * m_Angle, 0);
            go.GetComponentInChildren<MeshRenderer>().material = m_GameItemMatArr[i];
            go.GetComponentInChildren<GameItem>().SetVideoName(m_GameItemMatArr[i].name);
            go.GetComponentInChildren<GameItem>().Index = i;
        }
    }
    /// <summary>
    /// 向前转
    /// </summary>
    public void RotateForward()
    {
        Index++;
        if (Index >= m_GameItemMatArr.Length)
        {
            Index = 0;
        }
        transform.DORotate(new Vector3(0, -Index * m_Angle, 0), 0.3f);
    }
    /// <summary>
    /// 向后转
    /// </summary>
    public void RotateBack()
    {
        Index--;
        if (Index < 0)
        {
            Index = m_GameItemMatArr.Length - 1;
        }
        transform.DORotate(new Vector3(0, -Index * m_Angle, 0), 0.3f);
    }
}

猜你喜欢

转载自www.cnblogs.com/krystalstar/p/10823810.html