融入动画技术的交互应用

该博客介绍了一项使用Unity创作的交互应用,结合动画技术打造了一个摄像机漫游系统。作者利用Unity的动画系统制作了烟花粒子、云雾、鱼群等特效,并设计了人物行走和场景元素的互动。用户可以通过键盘和鼠标控制视角和场景元素的行为,体验虚拟世界的沉浸感。文章详细阐述了粒子系统、鱼群算法、人物动画和风车转动的实现过程。
摘要由CSDN通过智能技术生成

这次作业的要求是做一个交互应用,充分容易动画技术,所以我最开始就打算用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值