U3D报告.docx
《U3D报告.docx》由会员分享,可在线阅读,更多相关《U3D报告.docx(8页珍藏版)》请在冰豆网上搜索。
U3D报告
基于U3D的恶魔小射手游戏制作
张廷军计算机应用技术2014116102
游戏简介:
恶魔小射手游戏,是一款小型3D游戏,一个小英雄通过W,S,A,D控制上下左右,通过鼠标控制其方向(此游戏中设置主角自动射击),在一定场景内来完成击杀小恶魔的一款小游戏。
简单易懂。
首先新建一个工程,导入所需素材。
建一个001play场景。
将素材中的场景(Environment)拖入
,加入灯光效果。
将障碍物添加collider。
添加一个面片,将面片旋转到和地面平行然后放大,最终将此面片作为地面碰撞使用。
加入背景音乐在maninCamera中添加AudioSource,将PlayOnAwake与Loop选项勾选,如果觉得吵可以先关闭。
后面添加主角与主角的行为(行走,射击等)。
在Models下查看模型,在Characters中选择角色。
将player拖入到场景中reset一下。
创建一个文件夹PlayerAC用来存放动画的状态机。
切换到Animator窗口。
制作两个标志位Move与Dead。
然后制作动画切换,首先Idle可以切换到Move条件为Move为TRUE,反方向切换即为FALSE情况,AnyState即为任何状态,其可以切换到死亡状态,条件为death为TRUE,但是此时不可以方向切换(死亡不可以复活)。
此时状态机设置完成。
回到场景在Player下创建playerMove的脚本文件用来控制主角的移动。
首先定义一个speed,然后获取水平值。
使用transform来控制移动(方向与速度)。
下面设置相机跟随主角运动,先将相机调到一个合适的位置,选择mainCamera-gameobject-alignwithvie然后将相机拖到主角下面,但是此时相机跟随主角不太平滑,此时无法设置主角与场景的碰撞。
双击Player添加刚体与capsulecollider。
设置碰撞外边框。
在脚本中调用刚体方法检测碰撞。
设置主角刚体的轴,勾选position的Y轴与rotation的X与Z轴。
修改主相机的跟随方式,将主相机位置中Y,Z设置为固定值,然后添加脚本控制相机,设置主角标签为Plyer。
主相机通过标签获取主角位置。
在脚本中实现移动过程中添加动画播放。
voidStart(){
player=GameObject.FindGameObjectWithTag(Tags.player).transform;
}
//Updateiscalledonceperframe
voidFixedUpdate(){
Vector3targetPos=player.position+newVector3(0,6,-6);
transform.position=Vector3.Lerp(transform.position,targetPos,smoothing*Time.deltaTime);
}
在角色控制脚本中添加代码控制转向,将鼠标指向的地面与角色产生一条射线通过这条射线控制角色的转向。
voidUpdate(){
//控制移动
floath=Input.GetAxis("Horizontal");
floatv=Input.GetAxis("Vertical");
//transform.Translate(newVector3(h,0,v)*speed*Time.deltaTime);
rigidbody.MovePosition(transform.position+newVector3(h,0,v)*speed*Time.deltaTime);
//控制转向
Rayray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHithitInfo;
if(Physics.Raycast(ray,outhitInfo,200,groundLayerIndex)){
Vector3target=hitInfo.point;
target.y=transform.position.y;
transform.LookAt(target);//主角面向鼠标的点
}
//控制动画
if(h!
=0||v!
=0){
anim.SetBool("Move",true);
}else{
anim.SetBool("Move",false);
}
}
下面控制角色的射击与受到的伤害。
添加一个脚本,设置其血量为100。
添加一个方法用来设置角色死亡后禁止移动,角色皮肤产生红色渲染以显示死亡一段时间后在还原皮肤颜色。
voidAwake(){
anim=this.GetComponent();
this.playerMove=this.GetComponent();
this.bodyRenderer=transform.Find("Player").rendererasSkinnedMeshRenderer;
playerShoot=this.GetComponentInChildren();
}
voidUpdate(){
bodyRenderer.material.color=Color.Lerp(bodyRenderer.material.color,Color.white,smoothing*Time.deltaTime);//差值运算使其皮肤呦红色变白色
}
publicvoidTakeDamage(floatdamage){
if(hp<=0)return;//已经死亡直接返回
this.hp-=damage;
bodyRenderer.material.color=Color.red;
if(this.hp<=0){
anim.SetBool("Dead",true);//
Dead();
}
在场景页面主角下面的枪上添加脚本设置射击动作(射击频率、伤害)。
在枪口添加灯光,达到射击时的闪光效果
,将子弹发射特效拖拽到枪下。
添加LineRenderer组件实现弹痕效果,当子弹碰撞到障碍物或者敌人时显示弹痕,无碰撞时设置其长度为100m。
添加AudioSource组件添加射击声音(如想设置射击伤害可以通过设置频率完成)。
publicfloatshootRate=2;//每秒设计次数
publicfloatattack=30;
privatefloattimer=0;//计时器
privateParticleSystemparticleSystem;
privateLineRendererlineRenderer;
//Usethisforinitialization
voidStart(){
particleSystem=this.GetComponentInChildren();
lineRenderer=this.rendererasLineRenderer;
}
//Updateiscalledonceperframe
voidUpdate(){
timer+=Time.deltaTime;//判断设计器是否达到设计周期
if(timer>1/shootRate){
timer-=1/shootRate;
Shoot();
}
}
voidShoot(){
light.enabled=true;
particleSystem.Play();
this.lineRenderer.enabled=true;
lineRenderer.SetPosition(0,transform.position);
Rayray=newRay(transform.position,transform.forward);
RaycastHithitInfo;
if(Physics.Raycast(ray,outhitInfo)){
lineRenderer.SetPosition(1,hitInfo.point);
//判断当前的射击有没有碰撞到敌人
if(hitInfo.collider.tag==Tags.enemy){hitInfo.collider.GetComponent().TakeDamage(attack,hitInfo.point);
}
}else{
lineRenderer.SetPosition(1,transform.position+transform.forward*100);
}
audio.Play();
Invoke("ClearEffect",0.05f);
}
voidClearEffect(){
light.enabled=false;
lineRenderer.enabled=false;
}
添加敌人,将角色中的小熊拖到场景中,将标签修改为Enemy,设置敌人的状态机,类似主角设置动画效果。
将场景设置为Static。
敌人出现后一直追主角,当追到后Move停止。
设置敌人追击主角,将场景设置为static,打开window-navigation,点击烘焙按钮,此时整个场景即为导航的区域。
给敌人添加navmeshagent组件设置追击,然后添加脚本控制追击(通过获取主角的位置为敌人的目的地)。
voidAwake(){
agent=this.GetComponent();
anim=this.GetComponent();
}
voidStart(){
player=GameObject.FindGameObjectWithTag(Tags.player).transform;
}
//Updateiscalledonceperframe
voidUpdate(){
if(Vector3.Distance(transform.position,player.position)<1.5f){
agent.Stop();
anim.SetBool("Move",false);
}else{
agent.SetDestination(player.position);
anim.SetBool("Move",true);
}
}
此时会发现主角有滑动的现象,寻找发现主角的刚体摩擦与旋转摩擦太小,设置两个值为1000即可。
给敌人添加碰撞器设置于主角的碰撞。
将敌人刚体的freezeposition勾选Y因为只需控制X,Z即可,同理freezerotation(旋转)勾选X,Z因为只需控制Y即可。
由于敌人追击之后会推着主角走,在脚本中设置,当两者距离为一定值时敌人不再追击即可。
设置敌人被主角攻击后受到的伤害即敌人的健康值。
添加脚本设置其健康状况,当其死亡后先将其collider取消以防止其阻碍射击路线,然后将其Y坐标慢慢向下移动做成其沉入地面的效果,然后将其销毁。
设置敌人被击中后的音效与死亡音效。
添加触发器设置其对主角的伤害范围,添加脚本设置其伤害详情(攻击速度、伤害值)。
其他敌人可以套用第一种敌人的设置(注意设置其标签为Emeny)。
添加脚本设置敌人的自动生成。
至此游戏制作结束。
后期还可以加一些排行榜与其他的功能。