这个期末没有浓浓师生情。

在制作了一个《太空大战》的游戏之后,基本已经对Unity引擎的基本操作熟悉了,接下来就要开始在我喜欢的2D平面游戏方向的学习。

这是我的《太空大战》的链接:https://blog.csdn.net/weixin_43826242/article/details/85224287

做的有丶简陋,还是得继续学习才行,个人认为坚持是最关键的。

接下来是《Unity5.x从入门到精通》这本书的第七章,该章节的主题是创建基本的2D游戏场景。注意选择2D。

后面的过程比较简单,我就省略了,主要任务是先搭建整个游戏的背景

根据书上说的,先创建两个Layer,一个是Foreground另一个是Background,分别代表前后两个层。

左上角Edit -> Project Settings -> Tags and Layers 然后选加号创建即可。

然后创建两个Sprite(精灵),我个人理解精灵就是2D中的角色素材模型。

然后一个Sprite做成天空的背景,另一个是草地,然后多复制几个就可以铺满底部了。

最好调整一下摄像头。然后背景的位置最好Reset一下,看着比较顺眼。

接下来是制作一个会飞的 “天鹅” 的Animation :

先选择天鹅的swan_Sheet资源,然后设置成Multiple,应该是表示他是一张图里面有多个元素,这样整理2D素材的时候一般比较方便,在需要的时候将必要的部分Slice出来即可。

接下来是Slice操作:

上图里面有个Sprite Editor ,直接点开大概就是第二张图的样子,然后左上角Slice -> Slice 就可以将8张小图全部分开了。

实际上拿到资源的时候已经是切割完成的了。

然后创建swan的精灵对象,把这个已经切割好的集合拖动到 swan 的 Sprite Renderer 中的Sprite上面。

紧接着是利用这8个小动画来制作天鹅飞行的逐帧动画:

通过左上角Window -> Animation -> Animation 来打开动画编辑(Ctrl + 6)

选中swan对象就能看到编辑器右边有创建新的Clip , 然后创建 , Samples 改为10 , 能看到有两个起始的关键帧,末尾那个删除就行。

接下来就是把8个分开的小图像一个一个拖到时间轴上让他导入就行了,作者自己的Unity好像出了点BUG,托上去之后不知道为什么没有预览了,只有时间点在上面,书上是有预览的8个连续的小图的,评论区求个指点!

做好之后就可以点编辑器上面的播放按钮就能在Scene视图看到天鹅飞行的动画。

紧接着是给天鹅写一个移动的C#脚本,让天鹅在画面上面移动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SwanMove : MonoBehaviour {//定义天鹅的移动速度public float swanspeed;void Start () {//定义天鹅的初始位置transform.position = new Vector3(11.0f, 3.55f, 0);}void Update () {//当天鹅还没有移出屏幕的时候if (transform.position.x > -12.7f){//让天鹅向前移动transform.Translate(Vector3.right * swanspeed * Time.deltaTime);}else{transform.position = new Vector3(11.0f, 3.55f, 0);}}
}

写完上面的脚本组件直接给天鹅添加就可以了。

接下来是做一个帽子和保龄球:具体的操作几乎相似,直接从资源列表拖动即可

帽子有上下两半,因此要有一个父子关系。

在设定的时候前面的帽子是Foreground , order 顺序是 2 ;后面的帽子是Background , order 顺序是 0

然后制作保龄球,是Foreground , order 顺序是 1

order顺序这样设置可以表现出保龄球进入帽子的视觉效果。

从下面可以看出顺序设置的效果:

接下来,添加GameController来控制保龄球在天上随机下落

先新建一个Empty Object ,命名为GameObject , 然后写一个C#脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameController : MonoBehaviour {//定义公共的保龄球游戏对象public GameObject BowlingBall;private float maxWidth;//这里的time相当于多长时间之后开始掉落第一个public float time;private GameObject newBowlingBall;// Use this for initializationvoid Start () {//将屏幕的坐标转换成世界坐标Vector3 screenPOS = new Vector3(Screen.width, 0, 0);Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPOS);//获取保龄球自身的宽度float ballWidth = BowlingBall.GetComponent<Renderer>().bounds.extents.x;//计算保龄球实例化位置的宽度maxWidth = moveWidth.x - ballWidth;}// Update is called once per framevoid Update () {//倒计时下落保龄球time -= Time.deltaTime;//如果time为0了,就重新生成一个time作为下一次的时间,同时实例化一个保龄球if (time < 0){time = Random.Range(1.5f, 2.0f);float posX = Random.Range(-maxWidth, maxWidth);//赋值给实例化的位置Vector3 spawnPOS = new Vector3(posX, transform.position.y, 0);//实例化一个保龄球,同时返回给newBowlingBall这个游戏对象,一会销毁就销毁就可以指定这个游戏对象销毁newBowlingBall = (GameObject)Instantiate(BowlingBall, spawnPOS, Quaternion.identity);//销毁这个游戏对象Destroy(newBowlingBall, 10f);}}
}

用鼠标控制帽子的移动:给帽子添加2D刚体并且把Gravity Scale 设为防止帽子下落,冻结Z轴防止帽子旋转

写一个HatController脚本添加到Hat的父类对象上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HatController : MonoBehaviour {//定义帽子的位置和鼠标的位置变量private Vector3 rawPosition;private Vector3 hatPosition;private float maxWidth;// Use this for initializationvoid Start () {//将屏幕的宽度转换成世界坐标Vector3 screenPOS = new Vector3(Screen.width, 0, 0);Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPOS);//计算帽子的宽度float hatWidth = GetComponent<Renderer>().bounds.extents.x;//获取帽子的位置hatPosition = transform.position;//计算帽子最多能移动的宽度maxWidth = moveWidth.x - hatWidth;}//FixedUpdate在每一次的物理时间完成的时候调用private void FixedUpdate(){//将鼠标的位置转换成世界坐标rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);//设置帽子将要移动的位置和帽子移动的范围控制hatPosition = rawPosition;hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);//移动帽子GetComponent<Rigidbody2D>().MovePosition(hatPosition);}
}

然后给帽子添加Edge Collider , 勾选 Is Trigger 表示有碰撞事件触发

再在HatController中加入以下部分代码来控制碰撞事件

private void OnTriggerEnter(Collider other){//当有物体和帽子发生碰撞的时候就删除这个物体Destroy(other);}

在草地下方再添加一个碰撞体用来阻止保龄球继续下落,相同的步骤,然后就做成这样,注意一下偏移量offset别动

做到这里其实作者就发现一个无语的bug,因为这一章没使用Tags对游戏物体分类,然后上面帽子的碰撞器一碰到下面的草地就把草地的碰撞器给删除了,导致保龄球还是接不住。。果真这一章就是基础的小操作而已。加上tag之后就可以解决这种情况。

最后是给接保龄球来点粒子特效

发现一个问题,资源包package不能直接从压缩文件里拖进资源栏,Unity显示不能解压。

在特效的预置体调整一下 排序层 和 层的顺序

再在HatController中添加下面的代码

//特效对象public GameObject FX;。。。private void OnTriggerEnter2D(Collider2D other){//当有物体和帽子发生碰撞的时候就删除这个物体if (other.CompareTag("BowlingBall")){//实例化特效FXGameObject newFX = (GameObject)Instantiate(FX, transform.position, transform.rotation);//将这个实例化的新特效作为帽子的子物体,这样可以让特效跟着帽子移动一会newFX.transform.parent = transform;Destroy(other.gameObject);//延时销毁特效Destroy(newFX, 1.0f);}}

最后记得把特效的预制体拖动到帽子的脚本组件上,这样整个第七章的内容就完成了。

非常的简单,也很基础,希望里面的知识我都可以牢记。

附上看到的不错的内容吧,都是在本章中拓展学习到的内容:

1. Unity中屏幕坐标、视图坐标和世界坐标的相互转换

https://www.jianshu.com/p/b5b6ac9ab145

2. Unity中Tilling和OffSet的运用

https://blog.csdn.net/weixin_39591280/article/details/80893349

3. Unity的输出文件使用winrar快速打包成exe文件(好用)

https://blog.csdn.net/qq_27124771/article/details/82085137

最后是这个项目的最终打包作品exe,发到了github上面,还有一共3个脚本,虽然很简单,就当保留我的学习轨迹。

https://github.com/dzzhyk/Hat-and-Bowlingball-Chapter-07-

继续加油!

《Unity5.x从入门到精通》读书笔记(二)相关推荐

  1. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  2. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  3. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

  4. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  5. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

  6. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  7. 《李元芳履职记》读书笔记二 IT技术管理的沟通与团队建设

    <李元芳履职记>读书笔记二 接一 https://blog.csdn.net/qq_45937199/article/details/103305223 IT技术人员从技术岗走向管理岗,所 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  10. 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各 ...

最新文章

  1. 吴恩达机器学习笔记 —— 3 线性回归回顾
  2. spring_在基于Spring的Web应用程序中使用Http Session
  3. 037_CSS媒介类型
  4. 海量数据下如何使用多线程的导出 Excel
  5. leetcode 769. Max Chunks To Make Sorted | 769. 最多能完成排序的块(Java)
  6. listrecord根据某个属性去重_天刀手游琅纹搭配攻略,全门派全装备最细节提属性教学...
  7. 提高国内访问GitHub速度的9种方案~
  8. 惠普照片打印软件_被看错的打印机?原来打印机还可以这么玩
  9. IOS修改webView背景透明以及IOS调用前台js的方法
  10. 40-400-035-运维-优化-pt-variable-advisor优化工具
  11. java后台发送请求并获取返回值(续)
  12. 在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。GetStdHandle(参数)函数用于获得句柄
  13. 在小榕的论坛看的一篇关于DOS批处理命令的文章
  14. Hdu2558(欧拉函数)
  15. 【C++】单例模式代码实现
  16. 控制寄存器 cr0,cr2,cr3
  17. 过去分词和动词过去式区别
  18. LabWindows/CVI与Matlab混合编程的一种实现方法
  19. s8 android调用相机,android-扎根的Galaxy S8上的设备所有者
  20. setenv: command not found

热门文章

  1. mysql外网访问phpmyadmin_MYSQL如何用phpMyAdmin设置外部IP可以访问
  2. MySQL外网连接不上
  3. linux下 etho网卡设置
  4. 乘法口诀测试小软件,60000道乘法口诀练习题模板(4至9以内各10000题)
  5. Final Cut Pro V10.6.5 MAC 专属视频后期工具
  6. Iptables 指南 1.1.19(中文版)(三)
  7. 互联网与达尔文进化论的结合
  8. dockeroxidized
  9. word课程表设置符号与编号_Word2003文档怎么添加编号
  10. t460 拆解_ThinkPad T460s开箱及更换内存和硬盘