Unity3d 角色穿墙, 或者互插的解决方案

如果你在Unity里面使用了Rigidbody, 并且勾选了Is Kinematic 想自己通过Transfrom来控制角色的位置的话。那么你一定会碰到如果角色跑动快了,会插入到其他运动的角色或者静止的单位中,比如墙壁,建筑等等。

1:网上的解决方案: (老的解决方案

网上到是有解决方案,不过都太复杂,都需要自己去预判下一步的步长,这个就是以前的没有引擎的老方法,原理就是如果下一步会被碰到就把下一步的位置直接设置到碰撞的边缘,而不是走满那一步。既然说到这里我们就要说一下Unity带来的全新的解决方案,使用球状射线的原理。Unity摘录如下:

2:我的解决方案(球体射线碰撞)

Physics.SphereCast 球体投射

static function SphereCast (origin : Vector3radius : float, direction : Vector3out hitInfo : RaycastHitdistance : float = Mathf.InfinitylayerMask : int = kDefaultRaycastLayers) : boolean

Parameters参数

  • origin

    The center of the sphere at the start of the sweep.
    在扫描起点的球体中心点。

  • radius

    The radius of the sphere.
    球体的半径。

  • direction

    The direction into which to sweep the sphere.
    球体扫描的方向

  • hitInfo

    If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
    如果返回true,hitInfo将包含碰到器碰撞的更多信息。

  • distance

    The length of the sweep
    扫描的长度

  • layerMask

    A Layer mask that is used to selectively ignore colliders when casting a capsule. 
    根据Layer mask层的不同来忽略碰撞体。

Returns

boolean - True when the capsule sweep intersects any collider, otherwise false.

当胶囊物体投射时与碰撞体相交时,返回真,否则返回假。

原理: 把你的角色当成一个球型包围的物体,以他为中心,像一个球体发射射线,如果射线检查到碰撞体那么就认为碰撞了,然后就该处理你自己的逻辑,比如让角色停止,反弹,等等。以下是我在游戏中用到的

   //0.7米处有碰撞急停
    void Update ()
    {
        RaycastHit hit;
        Vector3 p1 = transform.position;
        Vector3 p2 = p1 + Vector3.forward * 0.5f;
        if(Physics.CapsuleCast(p1, p2, 0.0f, transform.forward, out hit, 0.2f))
        {            //停止该角色
            CActionControl.Instance().OnStopMove(uqid_);
        }
    }

3:说一说当初实现的方案以及为什么不行

最初想法是MonoBehaviour.OnCollisionEnter 使用这个接口来检测碰撞,但是这个接口只会检测出你碰撞的瞬间。也就是说你碰撞提接触的瞬间,但是并不会保证你没有在碰撞了。也就是说MonoBehaviour.OnCollisionStay状态可能一直存在,那么你下次就无法检测是否碰撞了,甚至到后来可能会两个角色都合体了。

也并不是说这个方案实现不了,但是会非常的复杂,比如你想反弹,当两个角色发生了MonoBehaviour.OnCollisionEnter的时候就按照碰撞方向的反方向进行反弹操作,具体的反弹代码只能自己去实现了(由于你是自己控制的Transfrom),而且如果对象多了的话可能会导致,对象像荡秋千一样弹过去了又弹过来。所以这里避免了这种情况,表示这种实现方案在游戏中很难做到!

Unity3d 角色穿墙, 或者互插的解决方案

时间: 2024-08-18 03:39:21

Unity3d 角色穿墙, 或者互插的解决方案的相关文章

unity3d 角色头顶信息3D&2D遮挡解决方案(二)

在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际运用中遇到了一个问题,请看图 3D场景嘛!近大远小! 当我把视角移动得很远时,头顶信息就变得很小了,小得我看不见它显示的是什么 而且如果有多个玩家的话,每个玩家都有头顶信息 当我离另外一个玩家很远时,那个玩家的头顶信息就看不见了 那么要头顶信息有何意义? 本文就解决这个问题,其实很简单的 下面是解决

unity3d 角色头顶信息3D&2D遮挡解决方案

先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 2D UI挡住了角色和cube 共同点是只显示未被遮挡的部分,遮挡的部分不显示 相信大多数人在看我这篇文章之前已经看过雨松momo的<人物头顶名称与血条更新与绘制> 没看过的可以去看看:http://www.xuanyusong.com/archives/1032 如果直接使用雨松momo文章中

Java与C#间json日期格式互转完美解决方案

http://blog.csdn.net/wilsonke/article/details/24362851 作用一种简单方便的数据传输方案,JSON已经成为替代XML的事实标准.然而在JSON中,时间(DateTime,Timestamp,Date等)格式一直没有很好地统一,当需要跨平台序列化/反序列化时,遇到不少麻烦.作者经过反复尝试,解决了C#与Java通过JSON进行时间传输的困难.C#解析Java/Javascript生成的JSON并不困难,但Java解析C#生成的JSON困难重重.下

Unity3D角色阴影制作

本文将重点介绍两种目前在移动平台上的主流阴影制作技术,同时也会简单介绍两种移动平台上相对较为高级的动态阴影生成方法. 由于目前主流使用Unity3.x在移动平台上并不支持阴影的动态生成技术,所以目前最普遍流行同时性价比也最高的阴影生成方法有以下两种: 1.  简单贴图法 所谓简单贴图法即是直接在角色的角底附加一个阴影半透明贴图,并让其跟随角色一起运动,一般是将该阴影Object成为角色模型的子物体,该种阴影生成效果如下: 阴影的Inspector视图如下: 其中ShadowComponent是控

Unity3D 角色(物体) 移动方法 合集

1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

unity3d,C#使用sqlite作为数据库解决方案思路

1,编辑器建立好数据库结构,生成sqlite数据库文件,可以用navicat图形界面编辑器来操作. 2,建立好的数据库,后缀名变为.txt格式(方便unity3d加载),放文件放到Assest/Resources目录下(新建目录). 放在Resources目录下的文件,在Pc/ios/android端均可以不作区分的用Resource来加载,假设数据库文件名位:data.txt,语句如下: TextAsset txt = Resources.Load ("data", typeof(T

关于Unity3D中鼠标移动指定物体的解决方案

一.鼠标拾取物体的原理 在Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下: 1.声明一个观察的摄像机.一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit: 2.将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐标(屏幕坐标): 3.定义碰撞RaycastHit为射线Ray与有碰撞属性的物体的碰撞点. 具体代码实现如下(C#代码): using System.Collections; using System.Collecti

Unity3D NGUI 点击穿透问题的解决方案

当3D场景和NGUI共存时, 点击上方的UI层按钮, 下方的3D物体也会触发OnMouseDown事件, 而有时这是我们所不希望的. 解决方案: 如果3D场景中的物体只需要点击等简单的操作, 那么可以将2D/3D镜头的UI Camera组件的EventType属性分别设为UI/World, 来将3D物体和UI的点击事件分开. 1.为主摄像机添加UI Camera组件, 并将EventType设为World 2.将3D场景中需要添加点击的物体, 添加UIButton属性(NGUI-Attach-B

unity3d角色控制器01

参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在地形或面对象之上,否则当它接收物理效果时发现地面没有东西支撑它,它就会掉下去, W.S.A.D移动人物行走,移动鼠标更改行走的方向,空格键人物会跳跃. 第一人称视角的实现原理是在游戏场景中创建了一个胶囊体的游戏对象,并且给胶囊体对象身上绑定了一个摄像机,摄像机对象如下图所示,它绑定在”Person