1 创建地板(floor)和四面墙壁,new Plane实现

自带的网格碰撞器Mesh Collider,勾选Convex,否则碰撞其他物体无效

2 创建几个cube物体,添加Box Collider和RigidBody,为cube创建脚本,控制物体移动,由于移动过程中物体会产生反转,造成前后方向异常,可以采用在updata方法里重置物体的旋转角度的方法:transform.localRotation = Quaternion.Euler(0, 0, 0);(四元数重置物体的旋转角度)

3 控制物体移动:

方法一:改变物体的位移:  transform.Translate(Vector3.left * speed);

方法二:为物体添加一个力:rigidbody.AddForce(Vector3.left * speed);

4 控制物体跳跃:

为了防止物体跳跃过高,需要提前处理跳跃逻辑,只在地面上可以跳跃,需要使用变量控制

1 为floor物体添加一个Tag标签,命名为Floor,

2 物体的碰撞事件(碰撞器):onCollisionEnter() OnCollisionExit() OnCollisionStay(),由于物体受重力影响,会一只在floor上面,物体的碰撞只在OnCollisionStay()方法处理,变量的值也在这个方法里控制

  1. void OnCollisionStay(Collision other)
  2. {
  3. Debug.Log("OnCollisionStay other :"+ other.gameObject.tag);
  4. if(other.gameObject.tag =="Floor")
  5. {
  6. isGround =true;
  7. }
  8. }
  9. Update()方法:
  10. if(Input.GetKey(KeyCode.Space))
  11. {
  12. if(isGround)
  13. {
  14. transform.Translate(Vector3.up );
  15. isGround =false;
  16. }
  17. }
3 物体的碰撞事件(触发器):OnTriggerEnter() OnTriggerStay() OnTriggerExit()此事件的触发条件是isTrigger设置为true才可以。

5 控制射线模拟射击行为

1 在需要发射射线的位置添加组件:Line Renderer;Light;Particle system

2 Line Renderer 配置材质(射线的颜色),射线起始宽度,结束宽度

3 Light里面配置点光源(Point),设置光源颜色(决定了射击时枪口光颜色)

4 射线发射物体创建子物体FaceLight(可选),决定了射击时正前方的颜色

5 注意:前4个组件默认不选中,以控制射击动作时射线和光线闪烁

6 编写代码,控制射线

1 awake函数里获取每个组件对象

2 updata函数里判断鼠标左键点击动作,点击鼠标左键即可触发射击操作

  1. if(Input.GetButtonDown("Fire1")&& timer >= betweenTwoShot &&Time.timeScale !=0)
  2. {
  3. Shooting();
  4. }
3 射击函数:这里才关联刚才未选中的组件,设计射线的位置朝向等
  1. gunLight.enabled =true;
  2. faceLight.enabled =true;
  3. gunParticle.Stop();
  4. gunParticle.Play();
  5. gunLine.enabled =true;
  6. gunLine.SetPosition(0, transform.position);
  7. Debug.Log("射线的位置:"+ transform.position);
  8. shootRay.origin = transform.position;
  9. shootRay.direction = transform.forward;
4 判断射线射击到其他物体的操作:使用Physics.Raycast(射线, RaycastHit射线碰撞器,射线长度,layer层);
注意:这里的layer层可以在项目环境中设置,U3D提供了32个layer层,系统占用8个,其余的我们可以自定义实现
5 获取layer层,并使用步骤4的方法判断射线是否处于该层
  1. shootableMask =LayerMask.GetMask("shooter");
  2. if(Physics.Raycast(shootRay,out shootHit, gunRange, shootableMask))//光线投射(射线起点,射线方向,射线长度,碰撞器)
  3. {
  4. //进入这个方法只是表示射线射击到了这个layer里,并不表示射击到了目标物体
  5. Debug.Log("射线已投射......");
  6. gunLine.SetPosition(1, shootHit.point);
  7. }
  8. // If the raycast didn't hit anything on the shootable layer...
  9. else
  10. {
  11. // ... set the second position of the line renderer to the fullest extent of the gun's range.
  12. gunLine.SetPosition(1, shootRay.origin + shootRay.direction * gunRange);
  13. Debug.Log("else......");
  14. }

6 设置脚本模拟敌人受到伤害

1 为敌人物体创并挂上脚本CubeHealth,射线发出后,由于敌人属于环境layer层的子类,可以获取到射线

2 使用射线碰撞器方法获取射线碰撞组件是否已经挂CubeHealth脚本的组件,获取到后做下一步处理

  1. CubeHealth cubeHealth = shootHit.collider.GetComponent<CubeHealth>();
  2. if(cubeHealth !=null)
  3. {
  4. Debug.Log("射线已投射--------------");
  5. }
3 敌人受到伤害后生命值减少,生命值小于0时,销毁
  1. publicvoidTakeDamage(int hit,Vector3 point)
  2. {
  3. defaultHealth -= hit;
  4. Debug.Log("cube health :"+ defaultHealth);
  5. if(defaultHealth <=0)
  6. {
  7. Destroy(gameObject);
  8. }
  9. }
7 设置摄像机跟随主角移动
1 为主角创建tag,命名为cube
2 为Camera创建脚本,找到主角的tag,插值器跟随tag移动
  1. publicclassCameraFollow:MonoBehaviour
  2. {
  3. publicTransform target;//设置跟随的对象,这里写主角的tag
  4. Vector3 offset;
  5. publicfloat smoothTime =5f;
  6. // Use this for initialization
  7. voidStart()
  8. {
  9. offset = transform.position - target.position;
  10. }
  11. // Update is called once per frame
  12. voidUpdate()
  13. {
  14. Vector3 v3 = target.position + offset;
  15. //插值器,表示在一定时间内(第三个参数),从坐标一(第一个参数)移动到坐标二(第二个参数)
  16. transform.position =Vector3.Lerp(transform.position, v3, smoothTime *Time.deltaTime);
  17. }
  18. }
8 设计游戏的Splash页面
1 添加Canvas组件,Canvas组件的子控件设置一个button和一个简单说明的text
Canvas组件说明:http://blog.csdn.net/wangmeiqiang/article/details/52531315
2 为Canvas增加image组件。
注意:image组件的Source Image资源必须是Sprite(2D and UI)格式,可以点击图片修改格式
3 为Canvas绑定的C#代码增加点击事件
1 代码里增加onButtonClick()方法
  1. publicvoid onButtonClick()
  2. {
  3. canvas.gameObject.SetActive(false);//设置Canvas隐藏
  4. human.gameObject.SetActive(true);//设置主角显示
  5. environment.gameObject.SetActive(true);//设置环境显示
  6. }
2 为Button物体增加上述点击事件

9 模拟随机敌人出现,增加游戏趣味
1 将步骤2里创建的cube物体创建为预制体,再增加一个圆形预制体
2 创建敌人管理类,在environment里创建空物体cube,绑定管理类cubeManager
3 管理类的实现逻辑:每隔三秒初始化两个物体
  1. publicclass cubeManager :MonoBehaviour
  2. {
  3. publicGameObject cubeObject;
  4. publicGameObject sphereObject;
  5. voidStart()
  6. {
  7. InvokeRepeating("CreateCube",3f,3f);
  8. }
  9. voidCreateCube()
  10. {
  11. Vector3 v3 = transform.TransformDirection(Random.Range(0f,6f),Random.Range(0f,4f),Random.Range(-26f,-6f));
  12. Instantiate(cubeObject, v3, transform.rotation);
  13. Instantiate(sphereObject, v3, transform.rotation);
  14. }
  15. }
4 将预制体绑定到空物体cube上

5 运行游戏,发现很多物体创建出来后,由于受物理因素的影响,会产生弹飞效果,飞出environment环境,但是没有销毁,造成游戏卡顿无响应
解决方法:在地板底部增加一个大于地板区域的,物体飞出范围碰撞到这个区域后,执行销毁函数
  1. publicclassDestoryObject:MonoBehaviour{
  2. //设置cube或者floor 的is Trigger为true时,才会执行此函数
  3. voidOnTriggerEnter(Collider other)
  4. {
  5. Debug.Log("OnTriggerEnter other :"+ other.gameObject.tag);
  6. if(other.gameObject.tag =="cube")
  7. {
  8. Destroy(other.gameObject);
  9. }
  10. if(other.gameObject.tag =="sphere")
  11. {
  12. Destroy(other.gameObject);
  13. }
  14. }
  15. voidOnTriggerStay(Collider collider)
  16. {
  17. }
  18. voidOnTriggerExit(Collider collider)
  19. {
  20. }
  21. }

unity3d射击类demo相关推荐

  1. Unity3D射击类游戏制作第五节--玩家角色-武器

    ps:因为在上一节中子弹的射击是连续的,暂时还没有找到解决的办法,所以在RobotPlayer中加了如下代码: if (Input.GetKeyDown(KeyCode.Space)){animato ...

  2. Unity3D射击类游戏制作第三节--游戏模型

    将此角色模型拖拽到场景中 在Resources–Animation中新建一个 New Animator Controller并取名为Player 将Player动画控制器拖到模型上 在Player动画 ...

  3. Unity3D射击类游戏制作第一节--场景搭建

    导入资源 在Asset Store中下载游戏所需的资源:FPS Icons Pack:RPG_FPS_game_assets_industrial:SciFiWarriorPBRHPPolyart 并 ...

  4. Unity3D休闲射击类游戏《Survival Shooter》完整源码

    Unity3D休闲射击类游戏<Survival Shooter>完整源码分享给大家学习,这个对于那些想要制作u3d射击类游戏有很大帮助. 运行环境是:Unity5.3.1 下载地址: ht ...

  5. 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇

    不知不觉这已经是第七篇文章了,今天来谈谈python中类(class)在游戏中的应用. 老规矩,先展现一下之前的几篇博文: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用pytho ...

  6. 简单的射击类Android游戏--《环形射击》

    时隔差不多一个月之久,又一个游戏诞生了,不过相较于之前的几款游戏,这款游戏的可玩性比较高,虽然说其游戏整体的框架复杂度是相当低的,因为可以把其定义为简单射击类小游戏,名字叫做<环形射击>. ...

  7. Java类Demo中存在_Java中的数据类型转换

    先来看一个题: Java类Demo中存在方法func0.func1.func2.func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{ float fu ...

  8. [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏

    前言  这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示    ...

  9. EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?

    盘点五款射击类RPG游戏:你喜欢这类型游戏吗? 2020-06-04 18:04:06 3点赞 10收藏 3评论 RPG这种类型的游戏有很多,也是有许多玩家的喜欢.说到射击类型与RPG相结合的游戏,不 ...

最新文章

  1. linux out of memory分析(OOM)
  2. rosserial_java_编写ros串口节点,使用官方serial包(示例代码)
  3. VTK:PolyData之ReverseSense
  4. Linux探秘之用户态与内核态
  5. javaweb在线问卷系统_2020 最新流行的Java Web报表工具比对
  6. 解决org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql ...
  7. 什么是 FreeMarker
  8. pycharm 快捷使用
  9. python网络虫营销_python与sem,大数据降低竞价推广成本利器
  10. QT GUI界面中集成VISIO绘图区详细说明
  11. ReportMachine通过嵌套表达式计算某个值。
  12. Android 电话的国家代码
  13. 【python柱状图】图例大小、位置,X轴刻度大小,旋转角度
  14. 微信小程序父子组件方法调用方法汇总
  15. 解决Win10桌面右键卡顿一直转圈圈的问题
  16. jQuery老矣,尚能饭否
  17. 运动快乐的来源-内啡肽
  18. 业务常识:线上充值与掉单
  19. 全球与中国智能监控摄像头市场现状及未来发展趋势
  20. python 发红包import random用redenv_python 发红包

热门文章

  1. ORA-29491: invalid table for chunking 错误记录
  2. Java 并发编程艺术 读书笔记
  3. 要求返回三位数中的水仙花数 ,数字范围在100-999中。(水仙花数:百位数的3次方+十位数的3次方+个位数的三次方=数字本身)
  4. 树形表实现 bootstrap-table + treegrid
  5. 在那个时候根本没有计算机房,王德厚:我们现在的写作环境与王瑶先生那个时候没有根本区别...
  6. Mac下编写C或C++
  7. 每页多张幻灯片密集打印的设置技巧
  8. mysql从数据库查询的时间与实际时间相差8小时(时区问题)
  9. Win10 企业版ltsc 无法访问samba网络共享问题及解决!(转)
  10. 微信小程序实现开关原理、动态添加class