精华内容
下载资源
问答
  • Unity2D碰撞检测

    万次阅读 2018-04-24 22:16:56
    很简单的一个判断:打飞机游戏中检测飞机与敌方子弹是否碰撞。写起来却废了我这个菜鸟不少功夫。 最开始, 我想到的是用OnTriggerEnter检测飞机与子弹相撞,但是无论怎么调试,都无法触发,只能作罢。这一点以后要...

         很简单的一个判断:打飞机游戏中检测飞机与敌方子弹是否碰撞。写起来却废了我这个菜鸟不少功夫

         最开始, 我想到的是用OnTriggerEnter检测飞机与子弹相撞,但是无论怎么调试,都无法触发,只能作罢。这一点以后要了解一下,为什么无法触发。或许是自己一直没有写对?

      private void OnTriggerEnter2D(Collider2D coll)
       {
            if(coll.tag == "Player")
            {
                Debug.Log("碰撞发生");
                GameObject.Destroy(this.gameObject);
            }
        }

            然后就想到用OnColliderEnter检测碰撞。这里要注意OnColliderEnter中的参数Collision与OnTriggerEnter中的参数Collider的区别。Collision.gameObject是与当前物体碰撞的物体的引用,而Collider.gameObject是进入触发器范围内的目标物体的引用。也就是说:Collision.gameObject指向的是与OnColliderEnter方法所在脚本所挂载的游戏物体碰撞的游戏物体(对方);Collider.gameObject指向的是OnTriggerEnter方法所在脚本所挂载的游戏物体自身(因为触发器包裹的一般就是游戏物体自身)。

        private void OnCollisionEnter2D(Collision2D coll)
        {
            if (coll.gameObject.tag == "EnemyBullet")
            {
                Debug.Log("碰撞发生(角色脚本)");
                GameObject.Destroy(this.gameObject);
                Debug.Log("玩家角色被销毁");
            }
        }
        private void OnCollisionEnter2D(Collision2D coll)
        {
            if (coll.gameObject.tag == "Player")
            {
                Debug.Log("碰撞发生(子弹脚本)");
                GameObject.Destroy(this.gameObject);
                Debug.Log("敌方子弹被销毁");
            }
        }


            以上是两个脚本中的代码,前者挂载在飞机上,后者挂载在敌方子弹上。另外,如果不销毁游戏物体,仅做输出调试的话,会发现飞机与子弹相撞时子弹把飞机“推走了”。这显然不符合需求,特别是如果后期需要给飞机添加无敌功能的时候。这时我们可以把飞机的Rigidbody 2D组件下的Body Type 这个属性修改为“Kinematic(运动学的)”。至于Body Type的三个选项的详细介绍,可以参考这篇博客:https://blog.csdn.net/SerenaHaven/article/details/78851089

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

    2015-03-15 11:42:00
    void Update() { if (Input.touchCount == 1 ... Physics2D.OverlapPoint(touchPos)) { // your code } } }   转载于:https://www.cnblogs.com/ninja9998877/p/4339036.html
    void Update()
    {
        if (Input.touchCount == 1)
        {        Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
            Vector2 touchPos = new Vector2(wp.x, wp.y);
            if (collider2D == Physics2D.OverlapPoint(touchPos))
            {
                //your code 
            }
        }
    }

     

    转载于:https://www.cnblogs.com/ninja9998877/p/4339036.html

    展开全文
  • Unity2d 学习笔记(四)碰撞检测

    千次阅读 2021-10-12 09:31:18
    首先,我们需要为想要进行碰撞检测的对象添加上图中绿色框中的两个组件,分别是 刚体2D以及盒子碰撞检测器。 其中盒子碰撞检测器中的触发按钮需要勾选。 当我们添加完上述的组件后,就需要编写脚本处理碰撞事件...

    碰撞检测功能在游戏开发里是比较常用的,比如地图上无法穿越的部分,以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。

    参考视频:Unity碰撞检测_哔哩哔哩_bilibili

     首先,我们需要为想要进行碰撞检测的对象添加上图中绿色框中的两个组件,分别是 刚体2D 以及 盒子碰撞检测器

    其中 盒子碰撞检测器 中的触发按钮需要勾选。

     当我们添加完上述的组件后,就需要编写脚本处理碰撞事件了,主要有下面的三个函数。

     当我们在脚本中调用上面的三个函数就可以检测到碰撞了。

    我们给敌人对象也设置一个 盒子碰撞检测器,然后再角色对象脚本中加入碰撞检测,具体的代码如下

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
    
    
        // 人物移动的速度
        public float speed = 5;
    
        // 获取移动指令变量
        public float moveX;
        public float moveY;
    
        // 获取角色的动画器
        Animator animator;
    
        // 获取角色的刚体组件
        Rigidbody2D rd2d;
    
        // 动画器变量名
        string PlayerState = "PlayerState";
    
    
        // 角色状态表
        enum CharState
        {
            idle = 0,
            walk = 1,
            attack = 2
        }
    
    
        // Start is called before the first frame update
        void Start()
        {
            // 获取动画器
            animator = GetComponent<Animator>();
            // 获取刚体组件
            rd2d = GetComponent<Rigidbody2D>();
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    
        void FixedUpdate()
        {
    
            // 首先判断是否移动
            // 获取x轴和y轴的移动指令
            // 获取水平方向指令
            moveX = Input.GetAxisRaw("Horizontal");
            // 获取垂直方向指令
            moveY = Input.GetAxisRaw("Vertical");
    
    
            
            // 获取人物的位置信息
            Vector2 p = transform.position;
            p.x = p.x + moveX * speed * Time.deltaTime;
            p.y = p.y + moveY * speed * Time.deltaTime;
    
            // 将新坐标赋值给物体位置管理属性
            transform.position = p;
            
            /*
            // 刚体的速度
            Vector2 movement = new Vector2();
            movement.x = moveX;
            movement.y = moveY;
            movement.Normalize();
            rd2d.velocity = movement * speed;
            */
    
            // 如果有移动就改变动画
            if (moveX != 0 || moveY != 0)
            {
                // 给动画器变量赋值
                animator.SetInteger(PlayerState, (int)CharState.walk);
                Debug.Log(animator.GetInteger(PlayerState));
            } else
            {
                animator.SetInteger(PlayerState, (int)CharState.idle);
                Debug.Log(animator.GetInteger(PlayerState));
            }
    
    
            // 然后判断是否按下了其他键
            if (Input.GetKey(KeyCode.K))
            {
                animator.SetInteger(PlayerState, (int)CharState.attack);
                Debug.Log(animator.GetInteger(PlayerState));
            }
    
        }
    
        /*
        void OnCollisionEnter()
        {
            Debug.Log("撞到啦...OnCollisionEnter");
        }
        */
    
    
        // 碰撞检测函数,进入的时候执行
        void OnTriggerEnter2D(Collider2D collider)
        {
            Debug.Log("撞到啦...");
            Debug.Log(collider.gameObject.tag);
        }
    
        //
        // 停留的时候执行
        void OnTriggerStay2D(Collider2D collider)
        {
            Debug.Log("一直停留在碰撞状态...");
        }
    
        // 退出的时候执行
        void OnTriggerExit2D(Collider2D collider)
        {
            Debug.Log("退出碰撞状态...");
        }
        
    
    }
    

    然后我们运行游戏,移动人物到敌人的地方就可以在控制台看到程序检测出碰撞了。

    展开全文
  • 碰撞检测时对direction.x ,direction.y分别进行Raycast判断,将没有遇到障碍的前进方向合成移动向量,再移动 问题:卡,非常卡,用在FixedUpdate中移动时明显迟钝 实际2d游戏的碰撞检测是什么样的?
  • 给箭和对象都加了刚体和碰撞,箭的预制体又加了个x轴上的恒定力为了让他可以横向飞走。 代码没有问题,<strong>OnCollisionEnter也都带了2D,但是就是箭直接穿过没有任何反应,声音和数值...
  • 为了提升unity2d的性能限制。这里使用http://surparaller.org制作的pelagia。他可以在单线程和多线程之间自由切换。像开发其他的单线程软件一样使用pelagia。只要通过简单的设置就可以在单线程和多线程间自由切换。...

    a16095f4c82931597658db11e265bd59.png

    前言

    多线程与单线程的自由切换一直是个有趣的话题。

    开发人员喜欢在单线程下开发,准确有序不容易出错。

    但是他们也舍不得放弃多线程带来的效率提升。

    为了提升unity2d的性能限制。这里使用 http:// surparaller.org 制作的pelagia。他可以在单线程和多线程之间自由切换。像开发其他的单线程软件一样使用pelagia。只要通过简单的设置就可以在单线程和多线程间自由切换。

    0535d563c13624254a9e603f58082683.png

    比如

    1.最近骑马与砍杀的游戏非常流行。

    2.让沙盒技术又受到了关注。

    3.沙盒技术是指在游戏中玩家可以自由发展获得不同的游戏剧情。

    4.最为有名的沙盒游戏还有P社的系列,其中包括维多利亚,钢铁雄心,欧陆风云等。

    5.让沙盒游戏好玩的关键是创建大量的游戏角色。

    6.例如骑马与砍杀每次都要创建上千个士兵。

    d9b785a27fd82342ae75bf7943ff746c.png

    从而

    创建大量游戏角色是对游戏引擎和游戏开发者的巨大挑战。

    这种挑战来自2个方面:

    1. 使用恰当的技术,让游戏支持动态扩展。
    2. 将游戏分解到不同的线程,让系统资源使用最大化。

    下面将用3个例子来说明如何进行操作。

    第一个来自unity官方的示例roguelike.你可以在下面的地址找到它的介绍和代码.

    https://learn.unity.com/project/2d-roguelike-tutorial

    https://github.com/surparallel/unity_example_of_pelagia/tree/master/Roguelike

    这个示例在性能方面有3个问题.

    1,协程导致游戏阻塞。

    2,不支持摄像头跟随。

    3,碰撞检测会失败,导致npc的重叠。

    所以针对上述3个问题我制作了Big Roguelike。

    你可以在下面的链接找到它。

    https://github.com/surparallel/unity_example_of_pelagia/tree/master/Big%20Roguelike

    Big Roguelikefe非常适合进行压力测试。我将地图扩大1千倍。并将npc数量设定到3000。

    11b6e3eeab21713f66f8b79d30ecb66c.png

    这样就达到了单线程下的极限。

    dc3e93d8da91fbb26d291b94dc4cca93.png

    为什么说单线程,因为只有一个线程处于满负荷的工作状态。

    7d29d2b616fe835a19282863fd316cc1.png

    当你完成了第一个挑战之后,会发现再多的软件优化也无法大幅提升性能。

    这时就要考虑更为激进的优化方案。

    普通的技术水平是远远不能满足沙盒游戏的。

    几个人甚至十几个人的战斗会让人昏昏欲睡。

    为了解决一核有难多核围观的问题。我创建了示例Ultimate Roguelike。

    你可以在下面的链接找到他。

    https://github.com/surparallel/unity_example_of_pelagia/tree/master/Ultimate%20Roguelike

    Ultimate Roguelike在屏幕上可以创建9千个npc.

    780faaa557720a2bbe0b940f5946a568.png

    对unity压力也非常的小。

    1ed6fd67585045aa23223a294e704def.png

    cpu的负载能力可以提升到60%。

    4a3d6909ce8fbd0ac1011f99beda4bca.png
    将游戏分解到不同的线程,看着似乎非常简单。
    但99%的游戏厂商都做不到。所以被玩家讥讽为单核游戏。
    游戏设计者需要的是简单的技术就可以使游戏丰富多彩。
    这样才能有余力设计更多复杂生动的剧情。

    多线程优化有很多方案可以选择。从头学习多线程知识要花上好几年的时间。pelagia只需要你知道基本的异步消息概念就可以写出高质量的多线程软件。

    a053d0bd0de1127db64a36ba702b607f.png

    如果unity是创建了一个世界,逻辑层级就是这个世界不同形式的镜像。unity是用颜色组成的世界,逻辑层是用其他数据组成的世界。通过异步消息将这些数据汇总起来就是在unity中看到的世界。pelagia根据使用数据的方式,读写或者逻辑依赖。将数据自动划分为不同的逻辑层,并为每个逻辑层配备消息路由,硬盘读写缓存等组件。这样就可以快速构建分层的世界。并把每个层放入不同的线程中。这与我们在实践中拆分软件系统所使用的方法是一样的。pelagia仅仅是将这个复杂的过程自动化了。

    dadfd9abd9312c09ec741432e3e3327c.png
    展开全文
  • ContactPoint2D contact = p_collision.contacts[0]; Quaternion rot = Quaternion.FromToRotation (Vector3.up, contact.normal); Vector3 pos = contact.point;...
  • Unity碰撞检测

    2020-06-11 15:13:52
    一:碰撞检测的最低限制条件 1.双方必须有碰撞核(Colider)。 2.有一方必须有物理特性(Rigibody) 举例:假如是2D物体 ,连个2D 物体都有碰撞核(BoxColider2D),一方有刚体(Rigibod2yD) 3D 物体碰撞核...
  • 第二种,使用2D射线碰撞检测 3D射线碰撞检测 从屏幕向鼠标点击位置发射一条三维射线,可能会出现一些偏移 这里省略实现方法 2D射线碰撞检测 从屏幕上对应的点,向鼠标点击位置垂直发射射线 写法一 从...
  • unity2D 碰撞/触发函数

    千次阅读 2019-09-12 15:16:26
    碰撞 void OnCollisionEnter2D(Collision2D collision) void OnCollisionExit2D(Collision2D collision) 触发 OnTriggerEnter2D(Collider collider) OnTriggerExit2D(Collider collider);
  • Unity2D碰撞无效问题和基本设置

    千次阅读 2021-02-23 10:43:06
    Unity2D碰撞无效问题和基本设置 最近开始学习unity,都是网站上找的一些白嫖的视频资源,然后也买了一些有关unity的比较新的书籍,这不论是视频还是书籍,讲述的内容主要讲的都是untiy3D,可能是因为unity2D功能是近...
  • unity3D ParticleSystem 粒子特效碰撞检测 2Ddemo OnParticleTrigger OnParticleCollision
  • 碰撞物体都添加到上 rigidbody2d组件。 其中body Type 一定要选择 Kinematic 原因:忘记了。到时查查。 (该选项是想保证能发生碰撞但是并不会发生效果) 2·添加 Collider 2d 组件  其中Is Trigger 不要选择...
  • 本文一部分为半年前所写,时间间隔较大,若有逻辑上的错误敬请见谅。 碰撞检测是2D游戏开发里经常要用到的东西,...碰撞检测必不可少的是碰撞体组件和刚体组件,在2D游戏里面也就是xxcollider2D和Rigicbody2D,同时...
  • unity初识之2d游戏中做碰撞检测

    千次阅读 2018-03-02 18:58:30
    后来用多了才知道是普通的射线判断碰撞检测 检测从某一点出发,到某一点之间,是否有其他物体。,用这种方式可以判断,是否可以行进等逻辑。 方法是,用RaycatHit2d ,该检测的gameobject是一个boxcollider2d类型...
  • Unity2D游戏停止碰撞检测

    千次阅读 2020-01-16 03:20:44
    Rigidbody2D>().isKinematic = true 让需要的人更容易搜到,就想写下来。(每次我找这样的信息就需要太久时间,不知道姿势哪里不对)。 <不重要的题外话> 前几天写完npc的行为,尝试放了50个...
  • Unity中的2D射线检测

    千次阅读 2019-07-18 15:14:58
    需要有2d碰撞器 private void Update() { if (Input.GetMouseButtonDown(0)) { RaycastHit2D hit = Physics2D.Raycast(this.transform.position, Camera.main.ScreenToWorl...
  • UGUI Image的2d碰撞检测

    万次阅读 2017-03-14 12:11:51
    2d的碰撞检测和3d的碰撞检测比较相似,发生碰撞的两个对象至少有一个带有刚体组件,两个对象都要有碰撞器,和3d不同之处在于2d碰撞的刚体使用的是rigidbody2D,碰撞器使用的是BoxCollider2D。 操作示例: 1创建2个...
  • unity2d检测是否碰撞

    千次阅读 2019-04-25 19:31:07
    public float x_power = 0.0f; public float y_power = 100.0f; private Rigidbody2D rb2D; void Start() { rb2D = gameObject.GetComponent<Rigidbody2D>(); } ...
  • 创建Unity3D项目和Unity2D项目的区别。 1.3D项目有摄像机和太阳光,2D项目只有摄像机 2.3D项目使用的贴图类型是Texture纹理,2D项目使用的贴图类型是Sprite 2D/UI    这里我们创建一次2D工程来实现飞机大战的碰撞...
  • unity碰撞检测的条件

    千次阅读 2018-05-31 19:40:40
  • 无法触发:OnTriggerEnter、OnTriggerStay、...如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。 如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。
  • Unity 2D 自定义碰撞系统(一)

    千次阅读 多人点赞 2019-06-20 10:59:25
    很久之前就想要用Unity实现一个比较复古的碰撞效果。 但是由于Unity的刚体是基于物理运算的,在发生碰撞的时候,会出现反弹等我们不希望出现的效果。 所以通过查看了一些类似的插件和官方的一些项目作为参考,实现了...
  • Unity3D游戏开发,2D物体的碰撞、触发方法代码、脚本: using UnityEngine; using System.Collections; public class ColloderTest : MonoBehaviour { void OnCollisionEnter2D(Collision2D coll) { Debug.Log ...
  • Canvas默认设置为Overlay模式,该模式默认UI在最上层,摄像机上面,所以摄像机发出的射线检测不到,使用另外两种模式就行了 没有给UI加碰撞碰撞器加成了2d的,我就是,2d好像只检测边缘碰撞 ...
  • 不论是2d还是3d的物体碰撞、触发检测之前,都要添加相应的组件collider,简单介绍几种比较常见的,Box Collider/Box Collider2D(箱式对撞机)、Capsule Collider/Capsule Collider2D(胶囊对撞机)、Sphere Collider/...
  • layer选要检测的层级本例为ground切不可勾选自己的层级,因为Raycast是返回检测到的第一个物体,射线是从物体内发射出的,返回第一个物体会只检测到Player。 Player拖拽胶囊体 using System.Collections...
  • 适用于Unity的Polygon2D编辑器 使用PolygonCollider2D对撞器为游戏对象生成网格,让您通过“编辑对撞器”按钮在Unity版本中绘制多边形平台。 只需将脚本拖到平台GameObject上,就可以了。 该脚本使用类。 安装/...
  • Unity 3D碰撞检测

    2019-12-18 22:56:03
    Unity3D中的2D碰撞检测碰撞器与碰撞器碰撞时将调用的函数碰撞与触发器相碰撞时被调用的函数碰撞器与触发器碰撞时将调用的函数碰撞与触发器相碰撞时被调用的函数==以上两个碰撞不能将各自的函数或参数改变,否则将...

空空如也

空空如也

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

unity2d碰撞检测