#创新实训#VR漫游项目汇报12

11 篇文章 0 订阅
11 篇文章 0 订阅
该博客介绍了Unity中的雾效模拟,详细讲解了如何在shader中实现这一特效。此外,还分享了如何利用本地txt文件编写答题模块,并提供了相关脚本示例。在HTC Vive VR环境中,博主展示了如何实现视频播放及交互功能,包括视频材质的shader结构和脚本控制。通过MovieTexture,实现了视频的播放、暂停操作,同时讨论了自定义交互方式的可能性。
摘要由CSDN通过智能技术生成

1.Unity中的雾效模拟

主要介绍如何实现shader中的雾效模拟特效。 




2.利用本地txt文件编写答题模块②


脚本——

  ①QuestionCounts.cs


using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
  
public class QuestionCounts : MonoBehaviour {  
    public int counts = 0;  
    public int ques_counts = 0;  
    public int all_questions = 5;  
  
    //每种类型有多少题目  
    public int sel_counts = 20;  
    public int fill_counts = 17;  
    // Use this for initialization  
    void Start () {  
          
    }  
      
    // Update is called once per frame  
    void Update () {  
          
    }  
}  

 ②QuestionButtons.cs

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEngine.UI;  
  
public class QuestionButtons : MonoBehaviour {  
    public GameObject sel ;  
    public GameObject tf;  
    public InputField answer;  
    // Use this for initialization  
    void Start () {  
          
    }  
    void enableSel(){  
        sel.SetActive (true);  
    }  
    void disableSel(){  
        sel.SetActive (false);  
    }  
    void enableTF(){  
        tf.SetActive (true);  
    }  
    void disableTF(){  
        tf.SetActive (false);  
    }  
    // Update is called once per frame  
    void Update () {  
          
    }  
}  

③Questions.cs

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEngine.UI;  
using System.IO;  
  
  
//与按钮交互的题目  
public class Questions : MonoBehaviour {  
  
    public Text m_text;  
    public QuestionCounts m_counts;  
    private bool select = false;  
    public string [] questions = new string[100];  
  
    public QuestionButtons buttons;  
  
    //分为填空题以及选择题  
    private string url_select = "";  
    private string url_fill = "";  
    //对应第几道题目以及什么题目  
    private int ques_count = 0;  
    private int ques_line = 2;  
    //已经显示题目  
    private List<int> sel_list = new List<int>();  
    private List<int> fill_list = new List<int>();  
  
    //存储正确答案  
    private string fill_answer;  
    private int true_answer = -1;  
  
    enum Type{  
        Selection = 0,  
        Fill = 1  
    };  
    private Type ques_type;  
    // Use this for initialization  
    void Start () {  
          
        //加载打包项目下的txt文件  
        string DPath = Application.dataPath;  
        int num = DPath.LastIndexOf ("/");  
        DPath = DPath.Substring (0, num);  
        url_select = DPath + "/Assets/question/select_question.txt";  
        url_fill = DPath + "/Assets/question/fill_question.txt";  
  
        //对应不同的题目进行不同的初始化操作  
        ques_type = Random.Range (0, 10) > 5 ? Type.Fill : Type.Selection;  
        switch (ques_type) {  
        case Type.Selection:  
            {  
                ques_count = Random.Range (0, m_counts.sel_counts );  
                sel_list.Add (ques_count);  
                ques_line = 3;  
                readText (url_select, ques_count, ques_line);  
                buttons.sel.SetActive (true);  
                buttons.tf.SetActive (false);  
                break;  
            }  
        case Type.Fill:  
            {  
                ques_count = Random.Range (0, m_counts.fill_counts);  
                fill_list.Add (ques_count);  
                ques_line = 2;  
                readText (url_fill, ques_count, ques_line);  
                buttons.sel.SetActive (false);  
                buttons.tf.SetActive (true);  
                break;  
            }  
        }  
  
  
    }  
  
    string ReadFile(string FileName, int ques_count,int ques_line){  
        //ques_count为第几道题目 从0开始  
        //que_line 为题目的行数 包含答案行  
        //返回的是题目  
  
        System.Text.Encoding.GetEncoding ("gb2312");  
        string[] strs = File.ReadAllLines (FileName, System.Text.Encoding.Default);  
        if (ques_count == -1) {  
            return "no data";  
            }  
        else{  
            string question = "";  
            for (int i = ques_count * ques_line; i < ((ques_count + 1) * ques_line - 1); i++){  
                question += strs [i];  
                question += "\n";  
            }  
            return question;  
        }  
    }  
  
    string ReadAnswer(string Filename, int ques_count, int ques_line){  
        //返回题目的答案哪一行的string 需要后续的处理  
        System.Text.Encoding.GetEncoding ("gb2312");  
        string[] strs = File.ReadAllLines (Filename, System.Text.Encoding.Default);  
        if (ques_count <= -1) {  
            return "no data";  
        }  
        else{  
            string answer = "";  
            answer = strs [(ques_count+1) * ques_line - 1];  
            return answer;  
        }  
          
    }  
    //确定正确答案的按钮  
    void processAnswer(string Filename, int ques_count, int ques_line,Type ques_type){  
        string answer = ReadAnswer (Filename, ques_count, ques_line);  
  
        switch (ques_type) {  
        case Type.Selection:  
            {  
                buttons.sel.SetActive (true);  
                switch (answer){  
                case "A":  
                    true_answer = 0;  
                    break;  
                case "B":  
                    true_answer = 1;  
                    break;  
                case "C":  
                    true_answer = 2;  
                    break;  
                }  
                break;  
            }  
        case Type.Fill:  
            {  
                switch (answer) {  
                case "true":  
                    true_answer = 0;  
                    break;  
                case "false":  
                    true_answer = 1;  
                    break;  
                }  
                break;  
            }  
        }  
  
      
    }  
  
    //最终显示在面板text上  
    void readText(string url, int ques_count, int ques_line){  
        string text = ReadFile(url, ques_count, ques_line);  
        m_text.text = text.ToString();  
        processAnswer (url, ques_count, ques_line,ques_type);  
    }  
  
    //每次答题后初始化与题目相关的参数  
    void initQuestion(){  
        ques_type = Random.Range (0, 10) > 5 ? Type.Fill : Type.Selection;  
        switch (ques_type) {  
        case Type.Selection:  
            {  
                ques_count = Random.Range (0, m_counts.sel_counts );  
                while (sel_list.Contains (ques_count)) {  
                    ques_count = Random.Range (0, m_counts.sel_counts );  
                }  
                sel_list.Add (ques_count);  
                ques_line = 3;  
                readText (url_select, ques_count, ques_line);  
                buttons.sel.SetActive (true);  
                buttons.tf.SetActive (false);  
                break;  
            }  
        case Type.Fill:  
            {  
                ques_count = Random.Range (0, m_counts.fill_counts);  
                while (fill_list.Contains (ques_count)) {  
                    ques_count = Random.Range (0, m_counts.fill_counts);  
                }  
                fill_list.Add (ques_count);  
                ques_line = 2;  
                readText (url_fill, ques_count, ques_line);  
                buttons.sel.SetActive (false);  
                buttons.tf.SetActive (true);  
                break;  
            }  
        }  
    }  
  
    //处理选择题的参数  
    public void sel_addCounts(int i){  
        //选择题中按钮传入0,1,3,4  
        //填空题传入string  
        if( true_answer == i){  
            m_counts.counts += 1;  
        }  
        m_counts.ques_counts += 1;  
        if (m_counts.ques_counts < m_counts.all_questions) {  
            initQuestion ();  
        } else {  
            buttons.sel.SetActive (false);  
            buttons.tf.SetActive (false);  
            string text = "your counts is :" + m_counts.counts.ToString ();  
            m_text.text = text;  
        }  
    }  
    //处理填空题的参数  
    public void fill_addCounts(int i){  
        //string answer = buttons.answer.text.ToString();  
  
        if (i==true_answer){  
            m_counts.counts += 1;  
        }  
        m_counts.ques_counts += 1;  
        //将inputField 清空  
        //buttons.answer.text="";  
        if (m_counts.ques_counts < m_counts.all_questions) {  
            initQuestion ();  
        } else {  
            buttons.sel.SetActive (false);  
            buttons.tf.SetActive (false);  
            string text = "your counts is :" + m_counts.counts.ToString ();  
            m_text.text = text;  
        }  
    }  
    // Update is called once per frame  
    void Update () {  
          
    }  
}  

3.Unity HTC vive VR环境中视频播放的实现与交互


视频材质的shader结构。

借助unity的shader中的Unlit/Texture,将ogv格式的视频,绑定到提到的这种shader的材质球上,通过脚本控制交互。


函数中声明了image属性的moviePanel视频播放面板,MovieTexture格式的视频。

通过(MovieTexture)moviePanel.material.mainTexture方法,获取到材质中绑定的目的视频。将其存入变量中。

函数中定义,如果视频正在播放时,将其暂停;如果在暂停时,恢复播放。

这样就实现了在VR环境中基本的视频播放,交互功能。

在自定义函数中,可以根据需求更改交互方式。以及可以不选用button的交互方式,通过其他trigger进行更复杂的交互。

代码:


using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEngine.UI;  
  
public class MoviePanel : MonoBehaviour {  
  
    public Image moviePanel;  
    public MovieTexture movie;  
    void Start()  
    {  
  
        movie = (MovieTexture)moviePanel.material.mainTexture;  
  
  
    }  
  
    public void PlayOrPause(){  
  
        if (movie.isPlaying) {  
            movie.Pause ();  
        } else {  
            movie.Play ();  
        }  
    }  
  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值