这次作业的要求是做一个交互应用,充分容易动画技术,所以我最开始就打算用unity做,因为unity的动画系统十分好用。又因为这个学期我们在学习虚拟现实,所以我做了一个摄像机漫游系统。
背景:更多的是自己的偏好,因为很喜欢烟花粒子的特效,所以很想看一看从不同的角度去看一看烟花绽放是什么样子,在此基础上延伸了很多,比如场景里风车的转动,鱼群的游动,烟雾的特效制作,人物行走的制作。
创意:使用者置身于一个虚拟场景中,通过自己的眼睛和不同的角度去观看各种动画,体验感较好,因为自己比较喜欢游戏,所以用的模型是游戏风,整个漫游系统给人很静谧的感觉。
功能与用法:使用者通过按键来控制摄像机上下左右的移动,拖拽鼠标旋转摄像机移动。通过按键来控制人物的移动和切换烟花的播放。可以从不同角度观看到场景里缓缓转动的风车,水面上升起的烟雾,天空中的云以及水里游动的鱼群。
技术:
粒子的制作
在本次作业我制作了烟花粒子,云雾粒子。
五种烟花粒子
烟花GUI切放()
#pragma strict
import System.Collections.Generic; //Used to sort particle system list
//Visible properties
var particles:GameObject[]; //gameObjects to spawn (used to only be particle systems aka var naming)
var materials:Material[];
var cameraColors:Color[];
var maxButtons:int = 10; //Maximum buttons per page
var spawnOnAwake:boolean = true; //Instantiate the first model on start
var showInfo:boolean; //Show info text on start
var removeTextFromButton:String; //Unwanted text
var removeTextFromMaterialButton:String;//Unwanted text
var autoChangeDelay:float;
var image:GUITexture;
//Hidden properties
private var page:int = 0; //Current page
private var pages:int; //Number of pages
private var currentGOInfo:String; //Current particle info
private var currentGO:GameObject; //GameObject currently on stage
private var currentColor:Color;
private var isPS:boolean; //Toggle to check if this is a PS or a GO
private var material:Material;
private var _active:boolean = true;
private var counter:int = -1;
private var matCounter:int = -1;
private var colorCounter:int;
var bigStyle: GUIStyle;
function Start(){
//Sort particle system list alphabeticly
particles.Sort(particles, function(g1,g2) String.Compare(g1.name, g2.name));
materials.Sort(materials, function(g1,g2) String.Compare(g1.name, g2.name));
//Calculate number of pages
pages = Mathf.Ceil((particles.length -1 )/ maxButtons);
//Debug.Log(pages);
if(spawnOnAwake){
counter=0;
ReplaceGO(particles[counter]);
Info(particles[counter], counter);
}
if(autoChangeDelay > 0){
InvokeRepeating("NextModel", autoChangeDelay,autoChangeDelay);
}
}
function Update () {
if(Input.GetKeyDown(KeyCode.Space)) {
if(_active){
_active = false;
if(image)
image.enabled = false;
}else{
_active = true;
if(image)
image.enabled = true;
}
}
if(Input.GetKeyDown(KeyCode.RightArrow)) {
NextModel ();
}
if(Input.GetKeyDown(KeyCode.LeftArrow)) {
counter--;
if(counter < 0) counter = particles.Length-1;
ReplaceGO(particles[counter]);
Info(particles[counter], counter+1);
}
if(Input.GetKeyDown(KeyCode.UpArrow) && materials.Length>0) {
matCounter++;
if(matCounter > materials.Length -1) matCounter = 0;
material = materials[matCounter];
if(currentGO){
currentGO.GetComponent.<Renderer>().sharedMaterial = material;
}
}
if(Input.GetKeyDown(KeyCode.DownArrow) && materials.Length>0) {
matCounter--;
if(matCounter < 0) matCounter = materials.Length-1;
material = materials[matCounter];
if(currentGO){
currentGO.GetComponent.<Renderer>().sharedMaterial = material;
}
}
if(Input.GetKeyDown(KeyCode.B)) {
colorCounter++;
if(colorCounter > cameraColors.Length -1) colorCounter = 0;
}
Camera.main.backgroundColor = Color.Lerp(Camera.main.backgroundColor, cameraColors[colorCounter], Time.deltaTime*3);
}
function NextModel () {
counter++;
if(counter > particles.Length -1) counter = 0;
ReplaceGO(particles[counter]);
Info(particles[counter], counter+1);
}
function OnGUI () {
if(showInfo)GUI.Label (Rect((Screen.width*.5)-250, 20,500,500), currentGOInfo, bigStyle);
if(_active){
//Time Scale Vertical Slider
//Time.timeScale = GUI.VerticalSlider (Rect (185, 50, 20, 150), Time.timeScale, 2.0, 0.0);
//Field of view Vertical Slider
//Camera.mainCamera.fieldOfView = GUI.VerticalSlider (Rect (225, 50, 20, 150), Camera.mainCamera.fieldOfView, 20.0, 100.0);
//Check if there are more particle systems than max buttons (true adds "next" and "prev" buttons)
if(particles.length > maxButtons){
//Prev button
if(GUI.Button(Rect(20,(maxButtons+1)*18,75,18),"Prev"))if(page > 0)page--;else page=pages;
//Next button
if(GUI.Button(Rect(95,(maxButtons+1)*18,75,18),"Next"))if(page < pages)page++;else page=0;
//Page text
GUI.Label (Rect(60,(maxButtons+2)*18,150,22), "Page" + (page+1) + " / " + (pages+1));
}
//Toggle button for info
showInfo = GUI.Toggle (Rect(185, 20,75,25), showInfo, "Info");
//System info
//Calculate how many buttons on current page (last page might have less)
var pageButtonCount:int = particles.length - (page*maxButtons);
//Debug.Log(page