由于制作射线有点复杂,加上快过年了一直忙时间不够,所以拖到了现在才弄出来。
思想,用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));
}
}