首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Unity RigidBody物理:不重叠图层时的碰撞

Unity RigidBody物理:不重叠图层时的碰撞
EN

Stack Overflow用户
提问于 2019-10-17 02:20:58
回答 1查看 218关注 0票数 0

Unity有类似CollideWhenRigidBodyLeavesLayer方法的东西吗?原因如下:

我的鼻咽癌有三个MovementTypes:行走、游泳和飞行

他们使用刚体来移动,对于行走的角色来说,它工作得很漂亮。

它对会飞的角色也很有效。通过调用Physics.IgnoreLayerCollision(FlyingCharacterLayer,WaterLayer),飞行角色现在可以在水面上飞行。

我的问题是,如何让我的游泳生物与水层保持重叠?

我已经启用了Physics.IgnoreLayerCollision(SwimmingCharacterLayer,WaterLayer),所以现在游泳角色可以重叠水面。

但我如何测试我的海洋生物是否离开了水,并在这里造成了碰撞,这样它就会转身继续游泳,而不是进化成一条会走路的鱼……

我的关卡(以及水位)是动态生成的,因此添加一个用于碰撞测试的周边障碍物并不是一个非常好的选择。

此外,“地面”图形/层存在于水层之下,所以我不认为有一个很好的方法来测试与地面的碰撞,因为我的鱼同时重叠在地面和水中。

我希望我错过了一些基本的东西:)

谢谢!

更新:我可以检查我的游泳角色是否不再与Physics.CheckSphere重叠水面

但我不知道该从那里做什么。如果我试图让他180度转身,他每一帧都会翻转,有时会回到水中,有时不会……

代码语言:javascript
运行
AI代码解释
复制
if(Physics.CheckSphere(transform.position, 0.25f, LayerMask.NameToLayer("Water")) == false)
{
    // Now I know that my fish is out of the water
    // but I can not figure out how to turn him around
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-17 18:12:57

我并不真的为此感到自豪,但在这里转来转去之后,我想出了一个办法。

它似乎能把鱼留在池塘里,但反弹的效果并不好。

它还完全违反了“不要对刚体变换大惊小怪”的规则...but,因为物理系统无论如何都不能与我一起工作……

代码语言:javascript
运行
AI代码解释
复制
enum CheckDirection { AHEAD, LEFT, RIGHT };
bool CheckAheadIsWater(CheckDirection dir = CheckDirection.AHEAD)
    {
        if(dir == CheckDirection.AHEAD)
            return Physics.CheckSphere(transform.position + transform.forward * 1.5f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
        if(dir == CheckDirection.RIGHT)
            return Physics.CheckSphere(transform.position + forward + transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
        if(dir == CheckDirection.LEFT)
            return Physics.CheckSphere(transform.position + transform.forward - transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));

        throw new System.Exception("No Check Existes For " + dir);
    }

void Update()
{
       if (!CheckAheadIsWater(CheckDirection.RIGHT))
        {
            print("about to leave water RIGHT");

            //turn left 45 degrees
            transform.rotation = Quaternion.LookRotation(transform.forward + transform.right * 0.5f);
        }

        if (!CheckAheadIsWater(CheckDirection.LEFT))
        {
            print("about to leave water LEFT");

            //turn right 45 degrees           
            transform.rotation = Quaternion.LookRotation(transform.forward - transform.right * 0.5f);
        }

        if (!CheckAheadIsWater())
        {
            print("about to leave water AHEAD");

            //bounce back 1 unit
            physicalBody.MovePosition(transform.position - transform.forward);
            //swim the opposite direction
            transform.rotation = Quaternion.LookRotation(-transform.forward);
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58423986

复制
相关文章
使用BitBlt实现位图背景透明
BOOL BitBlt(int x, int y, int nWidth,nHeight, CDC* PsrcDC, int xSrc, int ySrc, DWORD dwRop);
全栈程序员站长
2022/11/02
1.5K0
使用BitBlt实现位图背景透明
UGL之透明位图
为了更好的视觉效果,WindML还提供了一种透明位图(Transparent Bitmap)。
Taishan3721
2020/10/19
7090
UGL之透明位图
TransparentBitmap函数设置透明位图的原理分析
(1)以当前的hdc创建5个设备兼容dc(HDC):hMem,hSave,hBack,hObject,hTemp (2)将要透明处理的位图块选入其中一个hTemp,获取宽高,并转换成逻辑点值; (3)创建4个临时位图(HBITMAP):bmMem,bmSave,bmBack,bmObject 其中bmMem和bmSave为设备兼容位图,bmBack和bmObject为单色位图 (4)将创建的临时位图分别选入临时DC中,效果图如下:
全栈程序员站长
2022/09/13
4700
TransparentBitmap函数设置透明位图的原理分析
位图算法
很多不重复的整数,其中最大值不超过40亿,最小值是0,要求判断某个指定的整数,是否在这个集合中。
半生瓜的blog
2023/05/12
3460
bitmap位图索引技术占用的存储空间_bitmap位图
参考 https://www.cnblogs.com/lbser/p/3322630.html https://blog.csdn.net/catoop/article/details/111689777
全栈程序员站长
2022/11/17
1.1K0
bitblt函数 透明底图_手绘楼盘摆位图怎么画
CDC::BitBlt函数,应用在GDI的绘图中,有时候我们需要显示的位图有一部分是透明的,例如在棋类游戏中,棋盘图片和棋子图片融合的时候,棋子边缘应该是透明。
全栈程序员站长
2022/11/02
6210
bitblt函数 透明底图_手绘楼盘摆位图怎么画
【C++】位图
所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用
青衫哥
2023/04/24
3610
【C++】位图
redis位图-bitmap
见名知义,位映射,其实就是string类型的bit数组,并不是redis的基本数据类型,而是在string的基础上做的扩展,支持对位进行操作。
cuiyi
2023/01/04
1.3K0
【C++】位图
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中❓
平凡的人1
2023/10/15
1610
【C++】位图
C++位图
其次是set和哈希表。set自动可以排序且在红黑树中查找速度也很快。但要把40亿个整数加上红黑树的节点(三叉链外加颜色)放进内存里,内存明显不够,不可取;哈希表同样是把40亿个整数外加节点放进内存里,内存明显不够,也不可取。
梨_萍
2023/04/24
4670
C++位图
位图字体的制作与使用
由于有开发者反馈位图字体不会用,上周对位图字体的官网文档进行了更新,把细节介绍的更清晰了。今天,又遇到有没看文档的开发者来提问位图字体的使用问题,因此将官网文档同步到公众号,让更多人知道,也希望大家遇到问题,先翻一下官网文档和社区,再进行提问。
Layabox Charley
2020/11/30
3.7K0
位图字体的制作与使用
C++ 哈希的应用【位图】
位图(bitset)是一种特殊的数据结构,仅仅依靠 0、1 表示当前位置是否有数据存在,常用于对查找速度和存储空间有着高要求的场景中,除此之外,位图还可以配合宏定义,实现同时传递多个参数,比如系统调用 open,其中的参数2(打开方式)就是一个简单的位图结构
北 海
2023/07/28
3040
C++ 哈希的应用【位图】
Redis 中的 BitMaps(位图)命令详解
Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。它本身不是一种数据结构,实际上就是string(字符串)数据类型,但是它可以对字符串的位进行操作。可以把 Bitmaps想象成一个以位为单位的数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个 bitmaps 的最大长度是512MB,即2^32个比特位。 现代计算机用二进制位作为信息的基础单位,1个字节等位8位,例如 big 字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,big 分别对应的ASCII码分别是98、105、103,对应的二进制分别是01100010、01101001和01100111,如下图:
共饮一杯无
2022/12/25
1.1K0
Redis 中的 BitMaps(位图)命令详解
Flash 矢量图和位图性能对比 导出为位图/缓存为位图 export as bitmap / cache as bitmap
 大家都知道Flash处理矢量图比位图要慢,而具体的性能上对比也有不少的前人已经做过。
用户1258909
2018/07/24
9710
UGL之单色位图
除了标准位图,WindML还提供一种单色位图(Monochrome Bitmap)。这种位图的图案仅包含一种颜色,而且由GC的前景色来指定。
Taishan3721
2020/10/19
7020
UGL之单色位图
将非数字的用户ID映射到位图的方案探讨
今天技术群里有同学提出想讲非数字的用户 ID 映射到位图中,计划采用 murmur 3 哈希算法,询问冲撞率是多少。 借着这个机会简单聊下非数字用户ID 如何更好地避免冲突,是否有更好的思路。
明明如月学长
2023/03/09
9920
将非数字的用户ID映射到位图的方案探讨
位图索引(bitmap index)
位图索引是一种很高效的索引结构,对于多属性过滤的聚合查询很高效,玩的就是 bit。
Apache IoTDB
2020/09/27
2.5K0
位图索引(bitmap index)
占位图怎么写[通俗易懂]
想必大家对占位图都不会陌生吧,非常犀利的一个工具,当然也有非常多优秀的网站为我们提供这样的接口。 唯一遗憾的是国内的站点非常少。
全栈程序员站长
2022/09/20
3K0
位图在推荐系统中的妙用
最近正好闲了下来, 有时间做个技术总结吧. 这个还是两年多之前做的需求, 最后选择了位图作为推荐系统的核心数据结构, 过程很有意思, 简单总结一下.
用户2825413
2022/04/19
6090
位图在推荐系统中的妙用
点击加载更多

相似问题

我正在尝试将*ngFor中的内容分发到不同的html元素上,在不同的div中

10

Iterator:将最后一个元素与不同的值配对

24

在不同页面上以不同的方式控制具有相同ID的元素

13

如何使用事件侦听器管理不同元素的不同事件?

11

将事件从子元素复制到不同的div

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文