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 ();
}
}
}