那抱歉,上次那个Unity+kinect还没有更新,最近在深一步研究,不久将更新(绝对不负众望)!现在进入正题,十分钟带你打造unity3D第一人称射击游戏!
看完本篇博客,你将学会第一人称控制,粒子的添加,碰撞的检测,鼠标的监听,画2d图像,预制物体克隆,添加力,添加声音等等!(本篇博客假设你已经对unity稍微有点了解)
一,打开unity,创建一个场景,添加一个plane,(gameobject->createother->plane)。
二,添加虚拟第一人称任务(现在没搞模型,模型后面可以自己添加);Assert->importpackages->Charactercontroll,之后你将Project面板里面看到这个资源包,打开里面的charactercontroll文件,将里面的first Person controll拖动到合适的位置。
三,然后我们将添加一个虚拟的枪口,作为子弹的发生点!这个你可以创建一个椭圆,放在摄像机的最中间
然后要将椭圆设置为摄像机的子物体,这样他将随着摄像机运动(不能设置为任务模型的子物体,因为任务模型的不能上下移动,也就不是这样后不能上下射击)。也就是在hierahcry面板中点击你创建椭圆,拖到摄像机上,这样他就成了摄像机的子物体。可以点击运行测试下,你会发现这东西只是虚拟枪口,所以我们设置它看不见,点击椭圆,在修改面板上,有个MeshRender,你单击下,椭圆就看不见了,但是它存在,然后再点击CapsuleColisder,取消他的碰撞(以免影响子弹的射击);
三,子弹的射击
我们首先创建一个圆,(用这个圆来模拟子弹,如果你自己有子弹模型,就用子弹模型),然后在project中创建一个prefab,用于之后的克隆子弹,现在我们来子弹一点火焰效果,Assert->importpackage->particles导入粒子,点击里面的fire,将里面的Flame拖到游戏中,位置和你创建的球(子弹)一样,然后将你设置的,然后同样的方法,将火焰设置为,子弹的子物体,这样,火焰将和子弹一起运动,自己在属性面板里 修改火焰的大小,然后将子弹拖到你创建的prefab中,修改prefab的名字为balls!添加一个刚体属性,Rigidbody(Addcomment->ragidbody)然后删除游戏中的子弹(嗯,删除)!现在子弹的预制物体已经创建好了,现在我们来射击!
四 ,点击鼠标,发生子弹
现在 就是敲代码码的时候了
var aim:Transform; //克隆子弹 private var ball:Transform; //绘制准星的材质 var material:Material; function Start () { } function Update () { //将鼠标的图标隐藏 Screen.showCursor=false; //var zj=Vector3(Screen.width/2,Screen.height/2,0); //var ray:Ray=Camera.main.ScreenPointToRay(Input.mousePosition); //定义一个方向,为发射点y轴方向 var dir=aim.transform.TransformDirection(Vector3.up); //var dir=ray.direction; //按下鼠标左键 if(Input.GetMouseButtonDown(0)){ //实列化一个球,发射点的位置, ball=Instantiate(balls,aim.position,Quaternion.identity); //在某一个方向加一个力 ball.rigidbody.AddForce(dir.normalized*1000); print("----------->>>"); //三秒后删除小球 Destroy(ball.gameObject,3); } }
这里用到了,Screen.showCursor=false;将鼠标隐藏,要将他放在updatae中,放在start中不行var dir=aim.transform.TransformDirection(Vector3.up);这是定义一个方向,子弹将以这个方向射击
其他的没什么解释的了,注释很详细了,方法里面传入的参数,查一下API文档就行
五 ,现在们开始绘制准星
//绘制准星的材质
var material:Material;
先定义 一个材质,用来绘制图像
//绘制准星 function OnPostRender(){ DrawRecent(Screen.width/2,Screen.height/2,10,10); } //绘制四边形的方法 function DrawRecent(x:float,y:float,width:float,height:float){ //材质通道设置为默认的0 material.SetPass(0); //绘制2D图形 GL.LoadOrtho(); //绘制长方体 GL.Begin(GL.QUADS); //传入四个点的相对屏幕的坐标,先后分别是左上角,左下角,右下角,右上角 GL.Vertex(new Vector3(x/Screen.width,y/Screen.height,0)); GL.Vertex(new Vector3(x/Screen.width,(y+height)/Screen.height,0)); GL.Vertex(new Vector3((x+width)/Screen.width,(y+height)/Screen.height,0)); GL.Vertex(new Vector3((x+width)/Screen.width,y/Screen.height,0)); //结束绘画 GL.End(); }
这个没什么好解释的,注释有,按照各个规则就是
然后就是,如果你射击到了敌人,敌人就着火
四,射击敌人
首先我们,创建几个cube,这个用来模拟敌人,如果你有好的模型,就用模型。给cube创建ridibody
然后给它一个标签,在属性面板上面有个Tag,点击,选择player,给个player标签,你也可以点击addTag自己添加一个Tag,现在我们创建一个prefab预制火火焰,创建一个空物体,将先前导入的fires拖到空物体中
将空物体放入prefab中,改名为fires
现在 我们添加碰撞事件
新建一个脚本,
#pragma strict //预制火焰 var fires:Transform; //克隆火焰 private var fire:Transform; function Start () { } function Update () { }//碰撞监听 function OnCollisionEnter(other:Collision){ //如果碰到的事cube(先前我们将cube的tag设置成了player) if(other.transform.tag=="Player"){ //克隆一个火焰 fire=Instantiate(fires,other.transform.position,Quaternion.identity); //设置火焰的父对象为箱子,这样火焰将和物体一起运动, fire.transform.parent=other.transform;} }
五,你想加入声音嘛?如果你想,接着看两种方式添加音乐,首先添加背景音乐,点击摄像机,AddCommpent->aduio->aduiosource
首先 下载你需要的背景音乐,将音乐拖进Asset文件夹中,然后将音乐拖进刚才添加的aduiosource的中
然后 教你添加动作音效,在第一和代码中加入var music:AudioClip;
然后再发生子弹的那个方法中,AudioSource.PlayClipAtPoint(music,transform.position);播放,
六:挂载脚本
你首先将以第一个脚本,挂到摄像机上面,然后将第一个frefab(balls)拖到变量中
第二个脚本放在balls上,将fires和音乐拖到变量中!!
OK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 现在开火!!!!!!!!!