让我们继续来学习Unity2D游戏场景的制作,本文分为以下3个部分:

· 添加角色和控制

. 添加2D物理阻挡

· 添加2D效果

  通过制作一个移动帽子接保龄球的小游戏,我们可以学习到任何创建游戏对象,使用2D物理引擎和制作2D特效等。

·  添加角色和控制

  1. 创建游戏主角帽子

   帽子整体由Hat和HatFrontSprite两部分组成,为了让保龄球在被帽子接住时达到进入帽子的视觉效果,我们设置帽子的属性如下两张图所示。Hat的层级为0,而HatFrontSprite的层级为2,我们只要将保龄球的层级设置为1,就可以到达效果了。

  为帽子添加刚体,并且防止帽子下落。选择菜单栏中的命令,Component——Physic 2D——Rigidbody 2D(刚体)。在帽子的Inspector视图中,将Gravity Scale设置为0,防止帽子下落。选中Freeze Rotation Z 来固定帽子的角度,

  2. 创建保龄球

  创建好保龄球sprite后,为了让保龄球有自由下落的效果,我们为它添加刚体。选择菜单栏中的命令,Component——Physic 2D——Rigidbody 2D(刚体)。为了让保龄球与其他碰撞体之间有碰撞效果,选择Component——Physic 2D——Circle Colider 2D(2D圆形碰撞体)。

  如果不给保龄球添加刚体,那么游戏中的保龄球就不会自由下落。

  在游戏中,我们要生成多个保龄球,所以要将保龄球sprite制作成Prefab。将Hierarchy视图中的sprite直接拖到Project视图的文件夹中,就可以制作成预设体了。如下图所示:

  3. 创建脚本来控制保龄球帽子

  我们先创建一个空的游戏对象GameController,创建一个C#脚本也名为GameController,然后将GameController脚本拖到GameController对象上。

  1. public class GameController : MonoBehaviour {
  2. public GameObject ball;
  3. private float maxWidth;
  4. private float time = ;
  5. private GameObject newball;
  6. // Use this for initialization
  7. void Start () {
  8. //将屏幕的宽度转换成世界坐标
  9. Vector3 screenPos = new Vector3(Screen.width, , );
  10. Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
  11. //获取保龄球自身的宽度
  12. float ballWidth = ball.GetComponent<Renderer>().bounds.extents.x;
  13. //计算保龄球实例化位置的宽度
  14. maxWidth = moveWidth.x - ballWidth;
  15. }
  16.  
  17. void FixedUpdate () {
  18. time -= Time.deltaTime;
  19. if (time < )
  20. {
  21. //产生一个随机数,代表实例化下一个保龄球所需的时间
  22. time = Random.Range(1.5f, 2.0f);
  23. //在保龄球实例化位置的宽度内产生一个随机数,来控制实例化的保龄球的位置
  24. float posX = Random.Range(-maxWidth, maxWidth);
  25. Vector3 spawnPosition = new Vector3(posX, transform.position.y, );
  26. //实例化保龄球,10秒后销毁
  27. newball = (GameObject)Instantiate(ball, spawnPosition, Quaternion.identity);
  28. //如果不写时间的话,组件会被马上销毁的
  29. Destroy(newball, );
  30. }
  31. }
  32. }

   再来创建一个脚本HatController来控制帽子的移动,然后将HatController脚本拖到Hat对象上。

  1. public class HatController : MonoBehaviour {
  2. public GameObject effect;
  3. private Vector3 rawPosition;
  4. private Vector3 hatPosition;
  5. private float maxWidth;
  6. // Use this for initialization
  7. void Start () {
  8. //将屏幕的宽度转换成世界坐标
  9. Vector3 screenPos = new Vector3(Screen.width, , );
  10. Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
  11. //计算帽子的宽度
  12. float hatWidth = GetComponent<Renderer>().bounds.extents.x;
  13. //获得帽子的初始位置
  14. hatPosition = transform.position;
  15. //计算帽子的移动宽度
  16. maxWidth = moveWidth.x - hatWidth;
  17. }
  18.  
  19. // Update is called once per physics timestep
  20. void FixedUpdate () {
  21. //将鼠标的屏幕位置转换成世界坐标
  22. rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);//设置帽子将要移动的位置,帽子移动范围控制
  23. hatPosition = new Vector3(rawPosition.x, hatPosition.y, );//限制value的值在min和max之间
  24. hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);
  25. //帽子移动
  26. GetComponent<Rigidbody2D>().MovePosition(hatPosition);
  27. }
    }

  现在,在游戏中我们可以看到保龄球从天上随机不同位置掉落,但保龄球下落后,会穿过草地。帽子则会跟着鼠标左右移动。

 ·  添加2D物理阻挡

  注意:假如帽子有碰撞体,而保龄球没有添加碰撞体,那结果会怎样呢?保龄球与帽子碰撞后,没有任何反应。所以,参与碰撞的物体都必须要添加碰撞体。

  先给HatFrontSprite添加边缘碰撞体,Component——Physics 2D——Edge Collider 2D(2D边缘碰撞体)。然后再给Hat添加一个触发器,用来判断保龄球是否进入帽子,在Inspector视图中选中Is Trigger复选框。给Hat添加一个Edge Collider 2D组件,在编辑Edge Collider 2D之前,要先点击Edit Collider按钮,让Edge Collider 2D组件包裹住Hat。编辑过程要有耐心,需要不断地调整,学会编辑后,最好把编辑过程录制成视屏,以后忘记了的话,就可以按照视屏来操作。如下图所示:


  为了让帽子能够持续地接取保龄球,我们要在保龄球进入触发器后删除保龄球。于是我们在HatController脚本中添加如下代码:

  1. void OnTriggerEnter2D(Collider2D col)
  2. {
  3. //删除该碰撞物体
  4. Destroy(col.gameObject);

  为了让保龄球落到草地上后,不再下落,我们要给草地也添加一个碰撞体。GameObject——Create Empty,命名为ground,Component——Physics 2D——Box Collider 2D,设置ground属性如下图:

  现在,保龄球落到地面上后会被被地面挡住,我们移动帽子接到保龄球,不管你是否接到了保龄球,一段时间后,保龄球都会自动消失。

· 添加2D效果

  为了让帽子接到了保龄球后会出现火花粒子特效,现在让我们来制作一个简单的特效。先将粒子效果资源包导入到项目中,点击Import按钮导入即可。

  

导入Effects资源之后,设置Effects粒子预设体的Inspector面板中的Renderer属性。

  在HatController中添加帽子接取到保龄球之后,产生的粒子效果代码。

  1. public class HatController : MonoBehaviour {
  2. public GameObject effect;
  3. private Vector3 rawPosition;
  4. private Vector3 hatPosition;
  5. private float maxWidth;
  6. // Use this for initialization
  7. void Start () {
  8. //将屏幕的宽度转换成世界坐标
  9. Vector3 screenPos = new Vector3(Screen.width, , );
  10. Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos);
  11. //计算帽子的宽度
  12. float hatWidth = GetComponent<Renderer>().bounds.extents.x;
  13. //获得帽子的初始位置
  14. hatPosition = transform.position;
  15. //计算帽子的移动宽度
  16. maxWidth = moveWidth.x - hatWidth;
  17. }
  18.  
  19. // Update is called once per physics timestep
  20. void FixedUpdate () {
  21. //将鼠标的屏幕位置转换成世界坐标
  22. rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
  23. //print(rawPosition);
  24. //设置帽子将要移动的位置,帽子移动范围控制
  25. hatPosition = new Vector3(rawPosition.x, hatPosition.y, );
  26. //print(hatPosition);
  27. //限制value的值在min和max之间
  28. hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);
  29. //帽子移动
  30. GetComponent<Rigidbody2D>().MovePosition(hatPosition);
  31. }
  32.  
  33. void OnTriggerEnter2D(Collider2D col)
  34. {
  35. GameObject neweffect = (GameObject)Instantiate(effect, transform.position, effect.transform.rotation);
  36. neweffect.transform.parent = transform;
  37. //删除该碰撞物体
  38. Destroy(col.gameObject);
  39. Destroy(neweffect, 1.0f);
  40. }
  41. }

为HatController脚本添加粒子效果组件。

  最终游戏效果:

创建基本的2D场景(part2)的更多相关文章

  1. 创建基本的2D场景(part1)

    通过一个简单的2D游戏案例来学习unity 2D游戏开发,本文分为以下3个部分. · 创建工作层 · 添加静态景物 · 制作2D动画 通过这个案例,我们可以学习到unity2D游戏制作的基本流程,Sp ...

  2. NGUI使用教程(2) 使用NGUI创建2D场景而且加入标签和button

    1.创建2D场景 要使用NGUI创建2D场景,首先咱们必须新建一个项目,而且导入NGUI作为这个项目的插件,相信假设看过上一篇教程都知道怎么导入NGUI了,这里就不赘述,假设有疑问的能够去看上一篇教程 ...

  3. 使用three.js创建大小不随着场景变化的文字

    使用three.js创建大小不随着场景变化的文字,需要以下两步: 1.将文字绘制到画布上. 2.创建着色器材质,把文字放到三维场景中. 优点: 1.跟用html实现文字相比,这些文字可以被模型遮挡,更 ...

  4. 灵感闪现 篇 (一) 2d场景 3d 效果

    中途打断一下 ,框架文档的 更新. 另开一篇主题为 灵感闪现的 板块. 在工作生活中,总有发现新事物或新东西 而让自己突然 灵感闪现的时候,那么这个时候,我必须要抓住,并尽快把 这份灵感实现下来. 之 ...

  5. 3dmax实例教程-使用3ds Max 创建一个完整的场景

    本篇教程讲述了利用3ds max创建一个完整的场景. 灵感来源:当我在遇到一些事情睡不着觉的时候我便在努力想象一些别的事情,于是我便想到了这个场景,其实对于我的这个角色我即没有参考图也没有草稿图,有的 ...

  6. 使用Unity创建塔防游戏(Part2)

    How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...

  7. 创建自定义的Cocos2d-x场景

    操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...

  8. python中socket、进程、线程、协程、池的创建方式和应用场景

    进程 场景 利用多核.高计算型的程序.启动数量有限 进程是计算机中最小的资源分配单位 进程和线程是包含关系 每个进程中都至少有一条线程 可以利用多核,数据隔离 创建 销毁 切换 时间开销都比较大 随着 ...

  9. Three-js 创建第一个3D场景

    1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染    光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响    物体/他们是在相机透视图里主要的渲染队形:方块.球体等 ...

随机推荐

  1. 验证(C#和正则表达式)

    原文:验证(C#和正则表达式) 我们经常会需要验证字符串的格式,比如密码长度范围.电子邮件格式.固定电话号码和手机号码格式等,这个时候我们经常会需要用到正则表达式.但是正则表达式用起来性能会低一点,所 ...

  2. 纯Lambda实现斐波那契数列

    还需要考虑溢出等问题,主要无事写着玩 Func<float, float, float> a = (arg1, arg2) => 0f;//init ; a = (lastNumbe ...

  3. js获取最近几天的日期(转载)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. 安装Windows操作系统的驱动程序(驱动精灵版) - 进阶者系列 - 学习者系列文章

    安装完操作系统之后,就需要安装对应的驱动程序了.下面就简要介绍下驱动程序的安装.以驱动精灵驱动安装软件为例. 1.  下载驱动精灵. 从http://www.drivergenius.com/网站下载 ...

  5. Java设置环境变量

    客上转过来的. 非常多人写了非常久java代码.还不知道环境变量是怎么一回事.科普一下. 一.java设置环境变量 - 精简版   1.右键打开我的电脑->属性->高级->环境变量 ...

  6. 由浅入深学习.NET CLR 系列:目录

    经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NE ...

  7. requirejs的config及optimizer r.js配置

    1.怎么处理require.js这些不需要被合并的东西 所有appDir中的文件都会先copy到dir文件中,进行压缩,然后根据build.js中的配置进行相应的合并,包括img等:2.样式合并后原来 ...

  8. grunt实用总结

    grunt实用总结 文章梗概如下: 如何让Grunt在项目跑起来 初识:Gruntfile.js 术语扫盲:task & target 如何运行任务 任务配置 自定义任务 文件通配符:glob ...

  9. 2014.3.5-C语言学习小结

    知识点: 1.结构体 struct 2.联合体 union 3.枚举 4.结构.联合与函数 =========================== 结构体 思考:如果现在希望保存一个学生的信息,该如何 ...

  10. Java并发性和多线程

    Java并发性和多线程介绍   java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题, ...