关于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 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的 ...
随机推荐
- C语言中的指针和数组
下面的内容节选自由我所执笔的会议记录.对于本文的不足之处,各位可以提出自己的看法. Q1:指针和数组到底是怎么一回事? A:指针和数组有本质的不同.指针就是一个内存地址,在32位系统下,一个指针永远占 ...
- SSH2框架实现注冊发短信验证码实例
这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...
- python bs4 + requests4 简单爬虫
参考链接: bs4和requests的使用:https://www.cnblogs.com/baojinjin/p/6819389.html 安装pip:https://blog.csdn.net/z ...
- 深入浅出Node.js--数据通讯,NET模块运行机制
互联网的运作,最根本的驱动就是信息的交互,NodeJS 在数据交互这一块做的很带感,异步编程让人很惬意,关于 NodeJS 的数据通信,最基础的两个模块是 NET 和 HTTP,前者是基于 TCP 的 ...
- How to kill a process on a port on linux 怎么杀死 关掉一个端口
sudo kill `sudo lsof -t -i:9001`
- dubbo-admin 管理台的部署
首先上传dubbo-admin的war包 参考链接: http://www.open-open.com/lib/view/open1454043410245.html
- 远程调试Hadoop
远程调试对应用程序开发十分有用,那如何调试Hadoop源码?这里介绍如何用IDE远程调试Hadoop源码.本文以IntelliJ IDEA作为IDE,以调试Jobhistory WEB UI代码为例进 ...
- JAVA-从题目看算法,将输入字符串进行排序并输出
来看一个排列的样例.它所做的工作是将输入的一个字符串中的全部元素进行排序并输出,比如:你给出的參数是"abc" 则程序会输出:abc acb bac bca cab cba 这是一 ...
- C++内联函数详解
1.函数调用原理 "编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址.计算机随后将逐步执行这些指令.有 ...
- 每日英语:Secrets Of Effective Office Humor
Margot Carmichael Lester loves making good-natured jokes at work. As owner of The Word Factory, a Ca ...