精华内容
下载资源
问答
  • Unity2D游戏停止碰撞检测
    千次阅读
    2020-01-16 03:20:44

    萌新向

    查到一个前辈使用的方法是
    rigidbody.isKinematic = true;
    //this.transform.GetComponent<Rigidbody2D>().isKinematic = true
    

    让需要的人更容易搜到,就想写下来。(每次我找这样的信息就需要太久时间,不知道姿势哪里不对)。

    <不重要的题外话>
    前几天写完npc的行为,尝试放了50个。FPS就变得非常低了。
    盲人摸象一般。。。重写了行为,突然变得好起来了。
    之前NPC所有的行为都用Update 进行判断,对于性能耗损方面一无所知。
    后来改成用InvokeRepeating判断,然后那些一次性需要生成大量资源的,改成用协程,就会好太多了!

    后来在碰撞设定上面又难倒我了。。。
    如果一万个NPC都加上碰撞箱,跟刚体。那滋味难以想象。

    一开始的想法是让碰撞体Active = false,进入摄像机之后再Active = true;//或者直接移除碰撞箱跟刚体,进入摄像机之后再加入这些组件。

    然后进行了一些折腾。。遇到一些难题,比如如何输出一个Sprite。
    输出一个碰撞箱,可以通过射线,鼠标点击处,等方法。
    通过什么办法能get到场景中的一个Sprite ?如果不能get到这个Sprite 就不能给它添加 碰撞箱组件。

    然后再测试了让NPC的刚体进行睡眠。。。测试之后,发现只要有碰撞,刚体就会被唤醒。

    最后就搜到了这个办法。。之前我以为它是用于重力系统。。差点就错过了。
    这样碰撞箱被保留,又不会差生碰撞计算。如果需要进行碰撞,随时让该刚体isKinematic = false;
    真的是很好的方式!

    更多相关内容
  • 人物卡死的问题有很多, 目前笔者遇到的解决方案有 trigger 勾选, 改变刚体 Collider, 增加不可移动代码三种. 1. 两个碰撞体间 trigger 勾选 一般而言, 刚体 Rigidbody 所在的 Box Collider 2D 的 trigger 不打勾(打...

    人物卡死的问题有很多, 目前笔者遇到的解决方案有 trigger 勾选, 改变刚体 Collider, 增加不可移动代码三种.

    1. 两个碰撞体间 trigger 勾选

    一般而言, 刚体 Rigidbody 所在的 Box Collider 2D 的 trigger 不打勾(打不打勾看项目当时的需求和情况有所改变), 与之相撞的 BX2D 的 trigger 打勾

    image-20220515135206206

    但大部分项目这种肯定是做好的, 那么就有一种可能是人物底部方形和碰撞体方形重合, 于是有了接下来第二点

    2. 改变刚体 Collider

    我们可以把刚体底部(或者与碰撞体相撞的地方)设为原型碰撞 Circle Collider 2D

    image-20220515135334132

    如果这样也不行, 就有可能是刚体移动的代码是强制移动, 这时候我们可以给要被碰撞的物体加一个层级, 再在代码中加一个遇到不可移动的代码

    3. 增加不可移动代码

    新增层级 Unwalkable, 用了下方代码后在 WhatStopMovement 选择 Unwalkable

    再把不想穿过的层级变为 Unwalkable, 就可以实现不卡死碰撞

    image-20220515141433088

    (这里是刚体的配置)

    image-20220515141527387

    (案例中把 Titl Palette 改为 StopWalkable, 就不会卡死在wall)

    下方的代码移动是和项目的 player 移动相关, 我们是平面俯视移动(不是横版跳跃), 可以酌情参考

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour
    {
        [Header("Movement Speed")]
        public float moveSpeed = 1f;
        [Header("Player movement points")]
        public Transform movePoint;
        [Header("Movement detection layer")]
        public LayerMask whatStopMovement;
    
        [SerializeField]
        private GameObject item;
    
        /// Virtual axis values
        private float ver, hor;
        //Animation components
        private Animator ani;
        private float nu;
    
        // Start is called before the first frame update
        void Awake()
        {
            //Removing movePoint from the player
            movePoint.parent = null;
            //Get the animation component of the first child object
            ani = transform.GetChild(0).GetComponent<Animator>();        
        }
    
        private void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            hor = Input.GetAxis("Horizontal");
            ver = Input.GetAxis("Vertical");
            transform.position = Vector3.MoveTowards(transform.position, movePoint.position, moveSpeed * Time.deltaTime);
    
            if (Vector3.Distance(transform.position, movePoint.position) <= .05f)
            {
                if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) == 1f)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(Input.GetAxisRaw("Horizontal"), 0f, 0f), .2f, whatStopMovement))
                    {
                        movePoint.position += new Vector3(Input.GetAxisRaw("Horizontal"), 0f, 0f);
                        ani.SetTrigger("Move");
                        this.enabled = true;
                    }
    
                }
                else if (Mathf.Abs(Input.GetAxisRaw("Vertical")) == 1f)
                {
                    if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(0f, Input.GetAxisRaw("Vertical"), 0f), .2f, whatStopMovement))
                    {
                        movePoint.position += new Vector3(0f, Input.GetAxisRaw("Vertical"), 0f);
                        ani.SetTrigger("Move");
                        this.enabled = true;
                    }
                }
    
    
            if (Vector3.Distance(transform.position, movePoint.position) >= 2f)
            {
                movePoint.position = GameObject.Find("player").transform.position;
            }
    
            }
    }
    
    
    展开全文
  • 一个简单的测试,wasd可以控制相机运动,右键可以控制旋转角度,当相机移动到距离碰撞距离超过所设定的距离时,停止移动的方向移动,主要利用射线检测距离的功能。 using UnityEngine; using System.Collections...

    一个简单的测试,wasd可以控制相机运动,右键可以控制旋转角度,当相机移动到距离碰撞距离超过所设定的距离时,停止往移动的方向移动,主要利用射线检测距离的功能。

    using UnityEngine;
    using System.Collections;
    
    
    public class FlyCamera : MonoBehaviour {
        public float _mFSpeed = 250f;
        public float _mMaxSpeed = 500.0f;
        public float _mMinSpeed = 0.1f;
    
        /// <summary>
        /// 旋转轴向控制
        /// </summary>
        public enum RotateAxes {
            MouseXAndY=0,
            MouseX=1,
            MouseY=2
        }
        /// <summary>
        /// 实际使用的旋转轴向 
        /// </summary>
        public RotateAxes _mRotateAxes = RotateAxes.MouseXAndY;
    
        /// <summary>
        /// X轴向分量
        /// </summary>
        public float _mFsensitivityX = 12.0f;
    
        /// <summary>
        /// Y轴向分量
        /// </summary>
        public float _mFSensitivityY = 12.0f;
    
        /// <summary>
        /// X轴向最小旋转角度
        /// </summary>
        public float _mFminiX = -360.0f;
        
        /// <summary>
        /// X轴向最大旋转角度
        /// </summary>
        public float _mFmaxX = 360.0f;
    
        /// <summary>
        /// Y轴最小旋转角度
        /// </summary>
        public float _mFminiY = -60.0f;
    
        /// <summary>
        /// Y轴最大旋转速度
        /// </summary>
        public float _mFmaxY = 60.0f;
    
        /// <summary>
        /// Y轴向旋转
        /// </summary>
        float _mFrotateY = 0.0f;
    	
    	public float _mLimitHeight=1.2f;
    	public bool _mCanLimitHeight=false;
    
        
        public float _mPadRotAngle = 8.0f;
    
    	public enum RotateMode{
    		RotateByMoveMouse=0,
    		RotateByRightMouseButton=1
    	}
    	
    	public  RotateMode _mRotMode=RotateMode.RotateByRightMouseButton;
    
        private Vector2 _mFirstVec = Vector2.zero, _mSceondVec = Vector2.zero;
           	
        void Awake() {
            _mCanLimitHeight = false;
            _mFirstVec=Vector2.zero;
            _mSceondVec=Vector2.zero;
    
            Hide("UI");                
        }
    	
        void FixedUpdate () {
          		if(Input.GetKey(KeyCode.Delete)){
                    if(Input.GetKeyDown(KeyCode.B)){
                        _mCanLimitHeight = !_mCanLimitHeight;
                    }
                }
    
                if(_mCanLimitHeight){
          			transform.localPosition=new Vector3 (transform.localPosition.x,_mLimitHeight,transform.localPosition.z);
          		}
        }
    	
    	void Update () {
            _MoveCamera();
            if(_mRotMode==RotateMode.RotateByMoveMouse){
            	_RotateCamera(0);
            }else{
                _RotateCamera(1);
            }
            _ModifySpeed();
    
    	}
    
        void _ModifySpeed() {
            if (Input.GetKeyDown(KeyCode.KeypadPlus)) {
                _mFSpeed+=0.1f;
                if (_mFSpeed >= _mMaxSpeed) _mFSpeed = _mMaxSpeed;
                //print(_mFSpeed);
            }
    
            if (Input.GetKeyDown(KeyCode.KeypadMinus)) {
                _mFSpeed -= 0.1f;
                if (_mFSpeed <= _mMinSpeed) _mFSpeed = _mMinSpeed;
                //print(_mFSpeed);
            }
        }
    
        void _MoveCamera() {
            if (Input.GetKey(KeyCode.W) && CanMove(transform.forward)) transform.Translate(Vector3.forward * Time.deltaTime * _mFSpeed);
    
            if (Input.GetKey(KeyCode.S) && CanMove(-transform.forward)) transform.Translate(Vector3.back * Time.deltaTime * _mFSpeed);
    
            if (Input.GetKey(KeyCode.A) && CanMove(-transform.right)) transform.Translate(Vector3.left * Time.deltaTime * _mFSpeed);
    
            if (Input.GetKey(KeyCode.D) && CanMove(transform.right)) transform.Translate(Vector3.right * Time.deltaTime * _mFSpeed);
    
            if (Input.GetKey(KeyCode.Q) && CanMove(transform.up)) transform.Translate(Vector3.up * Time.deltaTime * _mFSpeed);
    
            if (Input.GetKey(KeyCode.E) && CanMove(-transform.up)) transform.Translate(Vector3.down * Time.deltaTime * _mFSpeed);
           
        }
       
        void _RotateCamera(int m_MouseKeycodeNumber) {
            
            if(Input.GetMouseButton(m_MouseKeycodeNumber)){
            		 if (_mRotateAxes == RotateAxes.MouseXAndY) {
    	           
    	            float rotateX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * _mFsensitivityX;
    	
    	          
    	            _mFrotateY += Input.GetAxis("Mouse Y") * _mFSensitivityY;
    	           
    	            _mFrotateY = Mathf.Clamp(_mFrotateY, _mFminiY, _mFmaxY);
    	
    	          
    	           transform.localEulerAngles = new Vector3(-_mFrotateY, rotateX,0);
    	           //Debug.Log("MouseXY");
    	           }else if(_mRotateAxes==RotateAxes.MouseX){
    		           
    		            transform.Rotate(0, Input.GetAxis("Mouse X") * _mFsensitivityX, 0);
    		            //Debug.Log("MouseX");
    		        }else{
    		           
    		            _mFrotateY += Input.GetAxis("Mouse Y") * _mFSensitivityY;
    		
    		           
    		            _mFrotateY = Mathf.Clamp(_mFrotateY, _mFminiY, _mFmaxY);
    	
    		           transform.localEulerAngles = new Vector3(-_mFrotateY, transform.localEulerAngles.y, 0);
    		           //Debug.Log("MouseY");
    		       }
            }
         
    
            }
    
        private void Hide(string someLayer)
        {
            GetComponent<Camera>().cullingMask &= ~(1 << LayerMask.NameToLayer(someLayer));
        }
        private RaycastHit _hit;
        public float rayLength = 0.5f;
        /// <summary>
        /// 相机距离检测与设定距离对比并返回是否运动的判断
        /// </summary>
        /// <param name="dir">本物体所朝的方向</param>
        /// <returns></returns>
        bool CanMove(Vector3 dir)
        {
            Ray ray = new Ray(transform.position, dir);
    
            //if (Physics.Raycast(ray, out _hit, RayLength, 1 << LayerMask.NameToLayer("wall")))
            if (Physics.Raycast(ray, out _hit, rayLength))
            {
                //print(_hit.transform.name);
                return false;
            }
    
            return true;
        }
    }
    

    工程的下载地址链接:链接: https://pan.baidu.com/s/1nhjrJ6eKB68oUfINPGcwQQ 密码: kd8r 。

    unity版本:Unity 2017.3.1p4

    大家有好的想法,可以写一下

    展开全文
  • Unity 2D检测物体碰撞

    2022-01-30 13:53:23
    Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是: rigibody和collider,刚体和碰撞器。 collider有不同的形状,形状越复杂,开销越大。 collider上可以勾选is Trigger选项,如果勾选,Unity的物理引擎就...

    添加物理脚本

    Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是:
    rigibody和collider,刚体和碰撞器。
    collider有不同的形状,形状越复杂,开销越大。
    collider上可以勾选is Trigger选项,如果勾选,Unity的物理引擎就不会启动,反之物理引擎会启动,如果碰撞会有力的作用,导致物体位移。

    使用脚本检测碰撞

    如果勾选is Trigger选项,就需要使用OnTriggerEnter函数进行检测。
    反之使用OnCollisionEnter函数进行检测。

    	private void OnCollisionEnter(Collision collision)
    	{
            print(collision.gameObject.name);
    	}
     	private void OnCollisionExit(Collision collision)
    	{
            print(collision.gameObject.name);
        }
        //触发检测  没有物理效果
    	private void OnTriggerEnter(Collider other)
    	{
            print(other.gameObject.name);
    	}
    
    展开全文
  • unity2d 碰撞回弹

    千次阅读 2019-04-02 09:01:19
    XY轴横版游戏中,两个角色碰撞时受力会互相撞飞。...此效果没有撞飞效果,但持续移动还是可以可以把角色缓慢推开。 第二种就是 usingSystem.Collections; usingSystem.Collections.Generic; using...
  • Unity2d 学习笔记(四)碰撞检测

    千次阅读 2021-10-12 09:31:18
    首先,我们需要为想要进行碰撞检测的对象添加上图中绿色框中的两个组件,分别是 刚体2D以及盒子碰撞检测器。 其中盒子碰撞检测器中的触发按钮需要勾选。 当我们添加完上述的组件,就需要编写脚本处理碰撞事件...
  • 首先,给主角添加2D刚体和2D碰撞器,为了让主角不受重力的影响,设置2D刚体的Body Type属性为Kinematic运动学,还有给需要碰撞的物体添加上2D碰撞器。 准备工作做好以后,控制主角移动却发现,并没有产生想要的...
  • unity2D之边缘碰撞无效

    2019-12-03 14:36:07
    我之前不知道为什么各种碰撞无效,碰撞条件都满足,就是不起作用 一个个试了很久,终于发现是rigidbody冻错了轴,我把x轴给冻了 但是我代码控制移动的时候也能动,我就没发现 取消就碰撞有效了,我的版本是5.6,也不...
  • 因为人物添加了Box Collider 2D 和刚体,因此当碰撞后会模拟实际的运动情况,和其它碰撞碰撞后会发生抖动; 解决方法: 通过刚体控制物体的运动和位置,而不是通过 transfrom.position 来获得物体的位置并更新; ...
  • 多个碰撞体判断 Collider2D[]colliders=Physics2D.OverlapCircleAll(transform.position,0.5f,1<<LayerMask.NameToLayer("Tree")); 单个碰撞体判断 Collider2Dcollider=Physics2D.OverlapCircle(transform...
  • Unity 2D 自定义碰撞系统(一)

    千次阅读 多人点赞 2019-06-20 10:59:25
    很久之前就想要用Unity实现一个比较复古的碰撞效果。 但是由于Unity的刚体是基于物理运算的,在发生碰撞的时候,会出现反弹等我们不希望出现的效果。 所以通过查看了一些类似的插件和官方的一些项目作为参考,实现了...
  • Unity2D_鼠标拖动物体移动

    千次阅读 2022-04-10 16:25:45
    给要拖动的物体添加2D碰撞
  • 该文章会介绍三种方案,实践部分前面会介绍三个方案公用的部分,后面会介绍三个方案的区别。 这些适用于游戏场景中的被射击物体是3D的,3D场景有深度的。但是子弹是2D的游戏类型。...整理思路是使用包围盒来简化碰撞.
  • Unity 2D人物移动

    2021-09-13 23:49:19
    Unity简单2D人物移动 首先创建一个Player,并且制作简易地面。地面可用Tilemap进行制作如图简单地面: 并且在地图map的inspector面板加上如图插件: 并且进行设置可以合并优化碰撞。 然后创建一个Player,并且挂上...
  • 两个物体发生碰撞事件的前提是:运动的那个要有刚体。
  • unity 2d角色移动卡住的原因

    千次阅读 2022-03-18 03:27:43
    unity 2d角色移动时卡住原地踏步的原因 可能是碰撞盒子是正方形 被地图的碰撞体卡住的原因 应该把脚底做成圆形的碰撞盒 防止和地面的碰撞盒子卡住
  • 射线: Physics2D.Raycast( ) 必须参数:起点、方向 可选参数:距离、Z轴深度、过滤条件(检测哪些层、是否检测触发碰撞器等) ...手册链接:Physics2D-Raycast - Unity 脚本 API 与碰撞体相关的射线/投射: .
  • 一、创建精灵并添加刚体和碰撞体 二、创建PlayerController脚本并编写 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour {...
  • 设置角色Rigidbody2D为kinematic,配置BoxCollider2D,记录移动方向为direction(Vector2) 碰撞检测时对direction.x ,direction.y分别进行Raycast判断,将没有遇到障碍的前进方向合成移动向量,再移动 问题:卡,...
  • Enemy AI Unity2D-平台巡逻移动小怪 前言场景二、编写代码总结 前言 简单编写一个unity2D循环移动小怪(纯移动) 场景 下图为一个简单测试场景: 二、编写代码 代码如下(示例): using System.Collections; ...
  • unity2d 游戏开发资源

    2018-10-04 09:05:19
    24 碰撞与触发 24 UI 界面 25 3.2 制作 Sprite2D 对象 25 图片属性编辑器 25 创建 Sprite 对象 26 加入到场景 27 保存场景 27 3.3 使用 Sprite2D 对象制作简易 GUI 27 将按钮加入场景 28 移动按钮位置 28 创建程序 ...
  • Unity2D】制作可以左右移动的平台

    千次阅读 2022-02-15 15:05:53
    游戏中经常出现各种可以移动的平台,如空洞骑士和死亡细胞里面的电梯。那我们也可以制作一个可以一直左右移动的平台。 先用SunnyLand的图片来实现一个简单的左右移动的平台 学习内容: 提示:这里可以添加要学的...
  • 2.boss节点,需要有2d刚体组件,碰撞器和下方的脚本 3.巴鲁节点,需要挂载动画控制器,动画控制器总共有三个动画,分别是站立动画,移动动画和战斗动画,目前战斗不考虑 4.动画控制器的设置如下,切换参数是浮点数...
  • Unity 2D碰撞效应 碰撞效应是5.0版本提供的功能。 Area Effector区域效应:适用于特定区域内的定向力度。 Use Collider Mask 使用碰撞遮罩 Collider Mask 碰撞遮罩 Use Global Angle 使用全球角度 Force ...
  • 新知识点:input.GetAxis, input.GetAxisRaw, Horizontal, Time.deltatime,调整参数时的小技巧,移动时滚动的解决方法:rigidbody锁定z轴+圆形碰撞
  • 再准备好一个EnemyBlueBug的C#脚本,我们就来编写代码,设计好随机移动,以及能移动的范围。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyBlueBug : ...
  • Unity2D物体按照指定路径不断移动

    千次阅读 2019-12-14 16:20:05
    今天在设计一个NPC时想让NPC沿着指定路径移动,可以使用MoveTowards以及MovePosition函数 在这里插入代码片
  • unity帧同步物理碰撞

    2018-05-16 09:30:49
    基于Unity的帧同步精确物理碰撞,可以模拟Unity客户端的精确的物理碰撞,保证客户端的的一致同步
  • 先解释一下为什么会出现碰撞时精灵抖动的bug: 有一种可能是我们修改精灵的位置时是对精灵的transform中的position进行操作,这样会不考虑物理碰撞,所以两个精灵碰撞时会相互嵌入,然后因为物理引擎又会相互分离,...
  • 移动物体加刚体,在Update中每一帧的时间不一样,造成物体受力不均匀,物体发生碰撞时抖动。 解决方法一: FixedUpdate是固定帧,每一帧的时间相同,FixedUpdate控制移动逻辑,LateUpdate控制相机跟随。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,681
精华内容 1,472
关键字:

unity2d碰撞后停止移动

友情链接: experience.rar