U3D官网教程之一,官网视频需要翻墙才能看,这里放上B站的视频链接(戳这里),这个up主有好几个翻译的官网教程。

设置方面,个人觉得不太懂的是灯光方面,虽然根据视频设置了相同的灯光,但是对一些什么主灯光,填充灯光的方向和灯光颜色设置不太了解。

①Main Camera设置Projection,这是一个雷电游戏,投射设置要改为Orthographic。正交投影从Y轴向下投影。

  (1) Perspective 透视:相机将用完全透视的方式来渲染对象。

  (2) Orthographic 正交:相机将用没有透视感的方式均匀地渲染对象。

②Player的Collider为Mesh Collider

③网格碰撞器利用一个网格资源并在其上构建碰撞器。对于复杂网状模型上的碰撞检测,它要比应用原型碰撞器精确的多。标记为凸起的(Convex )的网格碰撞器才能够和其他网格碰撞器发生碰撞。

④Player对象移动:

    private void FixedUpdate(){float moveHorizontal = Input.GetAxis("Horizontal");float moveVertical = Input.GetAxis("Vertical");Vector3 vr3 = new Vector3(moveHorizontal, 0.0f, moveVertical);Rigidbody rb = this.GetComponent<Rigidbody>();rb.velocity = vr3 * speed;rb.position = new Vector3;(Mathf.Clamp(rb.position.x, boundary._xMin, boundary._xMax),0.0f,Mathf.Clamp(rb.position.z, boundary._zMin, boundary._zMax));rb.rotation = Quaternion.Euler(0.0f, 0.0f, rb.velocity.x * -tilt);}

此处移动是通过直接改变Rigidbody的position,移动对象还有这几种方式,transform.Translate,transform.Position 和 rigidbody.MovePosition。transform.Translate相当于直接改变物体的位置,可以参照自身坐标系或者世界坐标系,如果物体本身不是刚体,这个方法完全可以搞定,但如果物体是刚体,这个方法在刚体发生了碰撞后会发生不规则运动。而MovePosition方法考虑到了物理引擎的东西。但是MovePosition使用的时候也有坑,比如直接在Update里写rigidbody.MovePosition(vector3.forward)你会发现根本运动不了。这个方法需要在参数里加上自身的位置。比如写成rigidbody.MovePosition(transform.position + Vector3.forward),你会发现可以正常使用了,而且刚体间的碰撞不会影响接下来的移动。

⑤动态生成小行星之后的销毁问题,当有未被击中的小行星时,如果不对器进行销毁,就会产生小行星无限移动,且累计越来越多的情况,因此需要设置一个边界当小行星到达边界的时候被检测到同时销毁,此处是添加了一个cube,去除了Mesh Render,就相当与物体只有边框了 ,不需要计算物理碰撞的情况,所以勾选一下Is Trigger,检测碰撞销毁即可。

⑥Player击中小行星后的爆炸效果,其实就是在子弹和小行星的碰撞后再Instantiate一个Prefab,这个Prefab就是一个爆炸效果,同时又有一个问题,这个Prefab会一直停留在场景中,因此需要对这几个Prefab添加一个Destroy(),两个参数,第一个是对象,第二个可以给定一个时间。

⑦子弹射击,创建一个空对象放在Player前方,并让他成为Player的子对象,就会产生子弹从飞机射出。同时新创建出来的Prefab(子弹)需要设置rb.velocity = this.transform.forward ;即让子弹沿Z轴移动。(vector3.forward的值永远等于(0,0,1)。transform.forward的值则等于当前物体的自身坐标系z轴在世界坐标上指向,因此不一定等于(0,0,1),但是其magnitude长度是1。)

 void Update () {if (Input.GetButton("Fire1") && Time.time > nextFire){nextFire = Time.time + fireRate;Instantiate(bolt, shotShawn.position, shotShawn.rotation);this.GetComponent<AudioSource>().Play();}}

此处在射击时设置nextFire和fireRate,负责就会出现子弹如同一条直线一样射击,这个fireRate就相当于硬直,后摇。同时还需要利用AudioSource添加射击音效。

⑧        this.GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere * tumble;小行星的旋转,下面这一部分时https://blog.csdn.net/hoxily/article/details/46299285的一部分:

如果这个空间体是一个球体(例如,当你想要一个距离坐标原点小于给定半径的随机点),你可以使用 Random.insideUnitSphere 乘上所需的半径。代码如下:

var randWithinRadius = Random.insideUnitSphere * radius;

请注意,如果你设置上面的球内随机坐标点的某个分量为零,那么你将不能正确地得到平面圆内的随机点。虽然这个点确实是随机的,并且落在正确的半径内,但是落点概率严重地偏向于圆的边缘,因此得到的点将会分布得很不均衡。你应该使用 Random.insideUnitCircle 来完成这项任务。代码如下:

var randWithinCircle = Random.insideUnitCircle * radius;

⑨协程

    IEnumerator MakePlantes(){yield return new WaitForSeconds(startWait);while (true){for (int i = 0; i < plantesCount; i++){Vector3 vr3 = new Vector3(Random.Range(-positionValue.x, positionValue.x), positionValue.y, positionValue.z);//行星位置 Quaternion qua = Quaternion.identity;Instantiate(hazard, vr3, qua);yield return new WaitForSeconds(spawnWait);//协程 暂时不太懂}yield return new WaitForSeconds(stopWait);if (isGameOver){uiTextReStart.text = "Press 'R' to restart game";isReStart = true;break;}}}

Unity 5.x中使用StartCoroutine方法开启协程,其方式有以下几种.

//形式一 
StartCoroutine(CustomCorutineFn()); 
StartCoroutine(CustomCorutineFn(7));//向方法中传递参数 
//形式二 
StartCoroutine(“CustomCorutineFn”); 
StartCoroutine(“CustomCorutineFn”,7);//向方法中传递参数

在开发中可能会开启多个协程,如果你想停止其中某个协程,你可使用StopCoroutine.但在使用时,你需要注意一点,停止协程的方式要与开启协程的方式一致.StopCoroutine(“CustomCorutineFn”)必须与StartCoroutine(“CustomCorutineFn”)成对使用,与StartCoroutine(CustomCorutineFn())一起使用则完全无效.

以下内容来自:https://www.cnblogs.com/InitialD/p/7348875.html

协程的真正用途是分步做一个比较耗时的事情,比如游戏里面的加载资源,

比如我们加载的资源有30个(total),但是一次加载完毕会耗费大量的时间,不可能让玩家在start中等待这么久,这时候协程的作用就出现了,协程是每帧lateUpdate之前执行yield return之前的代码,lateupdate之后执行yield return之后的代码,相当于每帧循环一次(前提是你的协程有循环体,否则一帧就执行完了),具体可以复制我的代码看一下日志,这样就不会卡在这加载30个资源这里,而是你在update里面继续做你的事情,我每次只加载1个,加载1个耗时显然远远小于30个。

上面的例子具体可以对应进入一张地图加载NPC,当你进入一张地图后,如果一次性加载30个NPC,你可能就卡在进地图的地方,等待这30个NPC全部加载出来之后才能行动,但是用了协程,你可以移动,可能你移动一步(或者几步),加载一个NPC,实际上你根本感受不到移动过程中有停顿的现象。

我个人理解,某种程度上可以把它认为是异步加载,但是这和BS的异步是不太一样的,只是说可以这么去简单理解。

就总结这么多吧,个人理解,如果有不对的地方欢迎指正。

Space Shooter相关推荐

  1. Unity官方案例之星际航行游戏(Space Shooter)学习总结

    这几天我学习了<Unity官方案例精讲>的Space Shooter部分,这个案例作为刚刚学习Unity的入门还是不错的,这是整个案例的代码. 下面对我觉得比较常见的几个用法进行一下总结. ...

  2. Unity3D官方案例1-星际航行游戏Space Shooter

    Unity3D官方案例1-星际航行游戏Space Shooter [1]学习中的使用的类 1.Input:使用此类读取常规游戏设置中的轴,访问移动设备的多点触控和加速度. 本例使用到的方法: GetA ...

  3. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

    目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...

  4. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

    最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...

  5. python游戏-space shooter

    第一步:构建基本框架 当前需要达到基本的模型: 2.构建屏幕大小,可移动敌人与可移动游戏角色. # pygame template - skeleton for a new python projec ...

  6. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(下)

    这部分内容关注的是游戏性的提升,包括音效.计分等功能的实现. 传送门: 太空射击(Space Shooter)流程介绍与代码分析(上) 太空射击(Space Shooter)流程介绍与代码分析(中) ...

  7. 将Unity官方射击游戏 Space Shooter 改为实时对战小游戏,使用天梯实时对战服务(NanoLink)

    将Unity官方射击游戏(Space Shooter)改为实时对战小游戏,使用天梯实时对战服务(NanoLink) io 类型游戏如此热门,有没有蠢蠢欲动? 如何让自己的游戏快速实现可实时联机对战? ...

  8. Unity 官方自带的例子笔记 - Space Shooter

    首先 买过一本叫 Unity3D开发的书,开篇第一个例子就是大家经常碰见的打飞机的例子,写完后我觉得不好玩.后来买了一本 Unity 官方例子说明的书,第一个例子也是打飞机,但是写完后发现蛮酷的,首先 ...

  9. unity游戏教程 space shooter (游戏控制器)

    为了更好地理解unity,模仿了教程,以下均为教程中的代码: GameController.cs: using System.Collections; using System.Collections ...

  10. Unity5 Space Shooter基础部分开发笔记

    位置布局 一般来说,新建的有关场景位置等,都要先进行位置初始化操作,子对象的布局是相对于父对象的. Main Camera MainCamera有两种主要的Projection,分别是Perspect ...

最新文章

  1. 随机挑选分类训练集和测试集
  2. 区块链论文:去中心化证人共同签名,让认证者诚信或被发现
  3. linux使用小技巧——screen
  4. 华为:Access、Hybrid和Trunk三种模式的理解
  5. Android开源项目分类汇总[转]
  6. 【计算理论】计算理论总结 ( 图灵机设计示例 ) ★★
  7. md5加密后的数据如何解密_如何在云中加密数据
  8. 上班路上的抉择----无解的CSP?
  9. 如何攻击Java Web应用【转载】
  10. 探索Julia(part12)--函数组合及管道
  11. 卸载pytorch_Pytorch中的hook的使用详解
  12. linux ns级定时器_linux学习13,一文弄懂内核的“绝对公平调度”机制是如何设计的...
  13. cafffe---之params参数
  14. VC2015搭建OpenCV环境(超详细教程)
  15. 提供淘宝进销存管理软件
  16. 在word中如何制作问卷调查?原来是使用word控件技巧!
  17. TortoiseSvn介绍(配置与管理)
  18. SparkSteaming实时接收网络端口数据和hdfs做Wordcount
  19. mumu血压计母亲节“拼团”盛大开启,百度与厂商打造双赢局面
  20. (计算几何+二分+网络流)P4048 [JSOI2010]冷冻波

热门文章

  1. Transformer模型详解(图解最完整版)
  2. 下载安装anaconda
  3. mac 设置java环境变量_mac下java环境变量配置
  4. finalshell链接不上虚拟机提示一直登录或链接不上怎么办
  5. 在JS中如何获取时间以及转换时间
  6. 发那科机器人没有码垛指令_FANUC 机器人码垛编程详细讲解
  7. Ajax XHR响应
  8. WPF实现炫酷Loading控件
  9. Android IMEI和MEID获取问题记录
  10. 世纪佳缘钓鱼白帽子,互联网安全的边界如何界定?