关于Unity中的碰撞检测和管理(2D)
创建Unity3D项目和Unity2D项目的区别。
1.3D项目有摄像机和太阳光,2D项目只有摄像机
2.3D项目使用的贴图类型是Texture纹理,2D项目使用的贴图类型是Sprite 2D/UI
这里我们创建一次2D工程来实现飞机大战的碰撞检测
一、2D中的碰撞检测
1.创建一个Canvas
2.把Canvas节点的Canvas组件中的Render Mode设置为Screen Space-Camera,并把Main Camera节点拖进Render Camera属性
3.把Canvas节点的Canvas Scaler组件的UI Scale Mode设置为Scale With Screen Size,并把Refernces Resultion设置为和Game视图分辨率一样的640X960
4.把地图贴纸设置为Texture类型,虽然是在2D项目当中,但是如果要做地图滚动的话,地图的类型必须是Texture
5,.创建一个Raw Image类型的UI节点放在父节点Canvas下面,把地图拖进去,节点大小设置为512X1024
6.设置地图节点的Scale的x为1.25,y也为1.25,覆盖整个Canvas画布
7.写一个脚本挂在sky背景节点下面控制地图滚动
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class sky : MonoBehaviour {
RawImage img;
public float speed = 0.1f;
// Use this for initialization
void Start () {
this.img = this.GetComponent<RawImage>();
} // Update is called once per frame
void Update () {
Rect r = this.img.uvRect;
r.y += this.speed * Time.deltaTime;
this.img.uvRect = r;
}
}
8.创建一个Image类型的名为player的飞机节点在父节点Canvas节点下面,把主角飞机贴图拖过去,set native size,调整一下节点的大小,128X128
9.给player增加一个Box Collider 2D形状组件,也叫矩形碰撞器,碰撞器size大小128X128
10.可以给player加一个刚体组件Rigidbody 2D,其实没必要加刚体,如果加了就设置重力Gravity Scale为0
11创建一个Image类型的名为enemy的敌机节点在父节点Canvas节点下面,把敌机贴图拖过去,set native size,调整一下节点的大小,128X128
12.给enemy增加一个Box Collider 2D形状组件,也叫矩形碰撞器,碰撞器size大小128X128
13.可以给enemy加一个刚体组件Rigidbody 2D,其实没必要加刚体,如果加了就设置重力Gravity Scale为0
14.写一个脚本挂在enemy敌机节点下面控制敌机运动
using UnityEngine;
using System.Collections; public class enemy : MonoBehaviour {
public Vector2 speed = new Vector2(, -);
Rigidbody2D body = null;
// Use this for initialization
void Start () {
this.body = this.GetComponent<Rigidbody2D>();
this.body.velocity = speed;
} // Update is called once per frame
void Update () { }
}
15.打开物理引擎设置
edit --> ProjectSetting -->Physices 2D;
打开后可以对重力进行设置,形状碰撞组件默认材质进行设置,还可以设置永远打开形状碰撞组件的边界框以及设置边界框的颜色
碰撞检测和刚体组件和碰撞形状组件都有关系,有时候没有用到刚体组件Rigidbody 2D,但是一定会用到碰撞形状组件Box Collider 2D
16.碰撞状态分为3种
a.开始
b.持续
c.结束
当两个物体发生碰撞,碰撞器会去遍历碰撞器所挂节点上的所有脚本,然后调用脚本写的函数。所以我们必须在要发生碰撞的物体节点下面的脚本里面写这三个碰撞函数
(1)OnCollisionEnter2D(Collision2D c)方法; -->开始碰撞
(2)OnCollisionExit2D(Collision2D c)方法; -->结束碰撞
(3)OnCollisionStay2D(Collision2D c)方法; -->碰撞持续;(一个物体粘着一个物体不分开的时候,大多数是两个物体碰撞在一起不分开一起运动的状态),里面的内容貌似只执行一次。
设置碰撞节点的Tag
在节点的Inspector视图的左上角的Tag属性选择,可以自定义Tag,有了Tag就可以知道自己碰到的是哪个节点
下面的代码写在player节点下面挂载的脚本里面
// 碰撞开始
// Collision2D 碰撞信息
void OnCollisionEnter2D(Collision2D c) {
// 获取了与我们碰撞的节点;
//
if (c.gameObject.tag == "enemy") {
Debug.Log("OnCollisionEnter2D Contact with enmy!!!");
} }
// 碰撞结束
void OnCollisionExit2D(Collision2D c) {
// Debug.Log("OnCollisionExit2D called");
} // 碰撞持续
void OnCollisionStay2D(Collision2D c) {
// Debug.Log("OnCollisionStay2D called");
}
// end
17.碰撞有两种类型,上面是碰撞器与碰撞器碰撞,还有一种碰撞是碰撞器与触发器碰撞
触发器就是把节点下面的Box Collider 2D碰撞形状组件的Is Trigger属性打钩,打钩之后,就不会产生碰撞效果,没有任何的物理运算。但是两个物体如果发生交互的时候还是会触发事件,触发函数,玩家捡金币就是用到这种碰撞,触发的函数有下面三个
(1)OnTriggerEnter2D(Collider2D c) -->开始
(2)OnTriggerExit2D(Collider2D c) -->结束
(3)OnTriggerStay2D(Collider2D c) -->持续碰撞
设置碰撞节点的Tag
在节点的Inspector视图的左上角的Tag属性选择,可以自定义Tag,有了Tag就可以知道自己碰到的是哪个节点
下面的代码写在player节点下面挂载的脚本里面
void OnTriggerEnter2D(Collider2D c)
{
if (c.gameObject.tag == "enemy") {
Debug.Log("OnTriggerEnter2D called");
}
} void OnTriggerExit2D(Collider2D c)
{
if (c.gameObject.tag == "enemy")
{
Debug.Log("OnTriggerEnter2D called");
}
} void OnTriggerStay2D(Collider2D c)
{
if (c.gameObject.tag == "enemy")
{
Debug.Log("OnTriggerEnter2D called");
}
}
18.最后,我们还需要一个碰撞矩阵列表,来表示哪些物体之间需要碰撞,哪些物体不用发生碰撞,比如玩家和玩家不用发生碰撞,玩家和敌机会发生碰撞......这个表一般是在开始的时候就确定的。
而这个矩阵的设置步骤
a.给每个节点设置所在的层(Inspector视图右上角的layer,可以自定义,更Tag一样的)
b.打开物理引擎设置edit --> ProjectSetting -->Physices 2D;下面那个三角形的矩阵就是碰撞矩阵,可以打钩和去钩,
不打钩就是不产生碰撞的两个物体之间不会产生碰撞消息,不管是碰撞器与碰撞器碰撞,还是碰撞器与触发器碰撞都不会去执行碰撞函数。
关于Unity中的碰撞检测和管理(2D)的更多相关文章
- Unity中游戏的声音管理
using UnityEngine;using System.Collections;using System.Collections.Generic;/// <summary>/// 用 ...
- Unity中2D和UGUI图集的理解与使用
图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...
- 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能
一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...
- Unity中实现全局管理类的几种方式
(搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...
- 关于Unity中的刚体和碰撞器的相关用法(二)
在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...
- 关于Unity中的NGUI和UGUI
一.用Unity开发2D游戏,有三套关系 1.GUI:Unity本身自带的GUI 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后(其实是Uni ...
- 游戏的物理和数学:Unity中的弹道和移动目标提前量计算
下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- 汇总:unity中弹道计算和击中移动目标计算方法
http://download.jikexueyuan.com/detail/id/432.html 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的 ...
随机推荐
- SSAS 笔记
SQL SERVER 2000创建多维数据集对应的cub文件 http://blog.csdn.net/zklth/article/details/6367816 http://msdn. ...
- AP_标准预付款核销基本操作(流程)
2014-06-04 Created By BaoXinjian
- 迪杰斯特拉Dijkstra算法介绍
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- java怎样获得JVM可能的总内存,最大内存,以及空暇内存?
public class Demo2 { public static void main(String[] args) { DecimalFormat df = new DecimalFormat(& ...
- VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义 解决: 打开项目属性对话框, C/C++ -& ...
- Linux中Nginx安装与配置详解 test(待整理 补全)
http://www.linuxidc.com/Linux/2016-08/134110.htm http://www.cnblogs.com/freeweb/p/5425554.html http: ...
- [sh]. 点的含义
. 的含义 当前目录 隐藏文件 任意一个字符 生效配置文件
- gitbook安装与使用
废话不说,直接主题: gitbook安装 =========== 1. 安装npm 从站点 https://nodejs.org/#download 下载node.js源码(点击绿色的INSTALL ...
- UML笔记1
UML包括 事物 结构:类,接口等等 行为:交互,状态改变等 分组:包,子系统等 注释 关系 依赖,关联(聚合,组合),泛化,实现 图 用例图,交互图(顺序图,协作图),类图,活动图,状态图等 扩展机 ...
- Ubuntu 16.04和win10双系统时间不一致解决办法
windows10和ubuntu16.04双系统,装完后,在windows下时间不对,之前的老办法是: sudo gedit /etc/default/rcS 2 utc=yes 改成utc=no 然 ...