制作水果忍者-JS-3

由于制作射线有点复杂,加上快过年了一直忙时间不够,所以拖到了现在才弄出来。

思想,用linerenderer渲染器来制作让玩着看到的线段,首先检测鼠标状态,利用鼠标按下时的状态,用mouseposition方法来检测鼠标当前位置,这个时候的位置是屏幕上的位置不是世界坐标位置,先记录先,然后在记录下一帧鼠标的位置,利用两帧之间的鼠标位置来划线,先是转换为世界坐标,然后将两帧之间的鼠标的移动距离来划分为10份,每划分一份就发射一条射线,在世界坐标中,用事先建立的容量为10的数组,记录10个点,前10个点都记录在数组中,第11个点利用队列的性质,先进先出记录。画出先后,利用划线的阿法值,来让划线消失。

然后就是实例化Instantiate来赋值创建的水果汁效果(利用粒子系统),

#pragma strict
var fire:boolean=false;//检测鼠标是否按下
var fire_pre:boolean=false;//上次的鼠标状态
var fire_down:boolean=false;//鼠标正在按下
var fire_up:boolean=false;//鼠标没有按下
var screenposition:Vector2;//鼠标在屏幕的坐标
var start:Vector2;//开始时鼠标的位置
var end:Vector2;//结束时鼠标的位置
var trail:LineRenderer;//划线渲染器
var index:int;//用于检测水果类型
var point1:int//
var linepart:int=0;//给渲染器赋值的数组序列
var trailposition:Vector3[] = new Vector3[10];//给渲染器赋值的数组
var trail_alpha:float;//让渲染器慢慢消失的阿法值
var started:boolean;//检测是否开始参数
var lineTimer:float;//用时间长久来画线
var g:GameObject[];//水果汁赋值参数
var p:GameObject[];//水果泡赋值参数


function Start () {
	
}

function Update () {
	
	screenposition.x = Input.mousePosition.x;//记录鼠标的位置
	screenposition.y = Input.mousePosition.y;
	
	fire_down = false;//鼠标按下时为真,反着为假
	fire_up = false;//和上面的意思差不多
	
	fire=Input.GetMouseButton(0);//鼠标按下时一直返回TRUE值
	if(fire && !fire_pre) fire_down = true;//鼠标刚刚按下
	if(!fire && fire_pre) fire_up = true;//鼠标刚刚按完
	fire_pre=fire;//记录鼠标上一帧状态
	
	controll();
	
	
}
function controll(){
	if(fire_down)
	{
		start = screenposition;//记录鼠标位置
		end = screenposition;
		linepart=0;
		AddTrailPosition();//画第一个位置
		started=true;//游戏开始
		lineTimer = 0.25;//多少秒后鼠标开始划线
		
	}
	
	if(fire && started )
	{
		start = screenposition;//鼠标当前位置
		
		var a:Vector3 = Camera.main.ScreenToWorldPoint(Vector3(start.x,start.y,4));//将鼠标当前位置转换为世界坐标位置
		var b:Vector3 = Camera.main.ScreenToWorldPoint(Vector3(end.x,end.y,4));//将鼠标上一帧位置转换为世界坐标位置
		
		if (Vector3.Distance(a,b)>0.1) {//鼠标移动的两点之间距离大于0.1是划线
			
				AddTrailPosition();
				linepart++;
			}
	
		end = start;//辅助鼠标当前位置,用于下一阵用
		
		trail_alpha=0.75;//辅助阿法
	}
	
	if(trail_alpha>0.5)
	{
		for(var j:int=0;j<9;j++)
		{
			for(var jj:int=0;jj<10;jj++)
			{
				var s=Camera.main.WorldToScreenPoint(trailposition[j]);//鼠标前一点位置
				var e=Camera.main.WorldToScreenPoint(trailposition[j+1]);//鼠标厚后一点位置
				var ray:Ray=Camera.main.ScreenPointToRay(Vector3.Lerp(s,e,jj*1/10));//将两点之间的距离划分为10等分,
				
				var hit:RaycastHit;
				if(Physics.Raycast(ray, hit,100,1<<8))//划一份就发射出一条射线,
				{
					BlowObject(hit);
				}
			}
		}
	}
	
	if(trail_alpha ==0) linepart=0;
	if(fire_up && started) started=false;
	setposition();
	var c1:Color = new Color(1,1,1,trail_alpha);
	var c2:Color = new Color(0,1,0,trail_alpha);
	trail.SetColors(c1,c2);
	if(trail_alpha>0) trail_alpha -= Time.deltaTime;
	
	lineTimer -= Time.deltaTime;
	if (lineTimer<=0.0) {
			AddTrailPosition();
			linepart++;
			lineTimer = 0.01;
		}
		
}

function BlowObject(hit:RaycastHit){

	if(hit.collider.gameObject.tag != "destory")
	{
		hit.collider.gameObject.GetComponent(OnKill).kill(hit.collider.gameObject.tag);
		//摧毁切到的物体
		Destroy(hit.collider.gameObject);
		//切完水果准备
		
		if(hit.collider.gameObject.tag == "red") index=0;
		if(hit.collider.gameObject.tag == "green") index=1;
		if(hit.collider.gameObject.tag == "yellow") index=2;
		//制造水果汁效果
		if(hit.collider.gameObject.tag !="boom")
		{
			var position:Vector3=hit.point;
			position.z=2;
			GameObject.Instantiate(g[index],position,Quaternion.identity);
			position.z=1.5;
			GameObject.Instantiate(p[index],position,Quaternion.identity);
		}
		
		//切到炸弹
		if(hit.collider.gameObject.tag != "boom")
		{
			 point1++;
				 
		}
		else
		{
			point1-=5;
		//	var ins1=GameObject.Instantiate(cube,Vector3(0,0,6.13),Quaternion.identity);
		//	yield WaitForSeconds(0.1);
		}
	}
	hit.collider.gameObject.tag = "destory";
	
}
function setposition(){
	var index1:int = 0;
	for(var v:Vector3 in trailposition){
		trail.SetPosition(index1,v);
		index1++;
	}
}
function AddTrailPosition(){
	if(linepart<9)
	{	
		for(var i:int=linepart;i<=9;i++)
		{
			trailposition[i] = Camera.main.ScreenToWorldPoint(Vector3(start.x,start.y,4));
		}
	}
	else
	{
		for(var ii:int=0;ii<=8;ii++)
		{
			trailposition[ii]=trailposition[ii+1];
		}
		trailposition[9]=Camera.main.ScreenToWorldPoint(Vector3(start.x,start.y,4));
	}
	
}













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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值