unity3d 物体撞击_unity中撞击物体消失使物体消失 - CSDN
  • 其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider 也有说一方有CharacterController,另一方有Collider,于是对 Character...

    好吧,网上好多资料显示发生碰撞条件如下:

    两个对象都有Collider组件且至少一个有Rigidbody组件
    其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider

    也有说一方有CharacterController,另一方有Collider,于是这里对 CharacterController做点补充。

    Unity圣典中的说法是:
     CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。  角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
    下面说说我自己的理解:
    (1)添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
    (2)虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
    一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
    但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
    一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。

    (3)碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。

    // this script pushes all rigidbodies that the character touches
    var pushPower = 2.0;
    function OnControllerColliderHit (hit : ControllerColliderHit) {
       var body : Rigidbody = hit.collider.attachedRigidbody;
       // no rigidbody
       if (body == null || body.isKinematic)
         return;   
    
       // We dont want to push objects below us
       if (hit.moveDirection.y < -0.3) 
         return; 
    
       // Calculate push direction from move direction, 
       // we only push objects to the sides never up and down
       var pushDir : Vector3 = Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
       
       // If you know how fast your character is trying to move,
       // then you can also multiply the push velocity by that.
       // Apply the push
       body.velocity = pushDir * pushPower;
    }


    展开全文
  • unity3d中如何检测两个物体的碰撞,这是困扰我很久的问题,经过一番测试发现一种方法比较便捷!若有两个Cube,分别为Cube01和Cube02,当拖动Cube01的时候,如何才能检测到碰撞到Cube02了呢?这里有几个重要的步骤...

    
    
    在unity3d中如何检测两个物体的碰撞,这是困扰我很久的问题,经过一番测试发现一种方法比较便捷!若有两个Cube,分别为Cube01和Cube02,当拖动Cube01的时候,如何才能检测到碰撞到Cube02了呢?这里有几个重要的步骤:

    1.给Cube01和Cube02分别添加Collider组件(Box Collider等等,更具具体情况而定

    2.给Cube01添加Rigidbody 组件,并将重力勾选掉,不然会出现物体坠落的状况

    3.给Cube01添加碰撞检测的函数

    using UnityEngine;
    using System.Collections;
    
    public class test : MonoBehaviour {
    
    	void OnTriggerEnter(Collider other){
    	Debug.Log (other.gameObject.name);
    }
    }
    


    展开全文
  • 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显示撞击的球体数,12个Cube被撞击后提示游戏结束。 创建项目,创建背景和球 创建...

     

    本篇实现一个球体在固定区域移动撞击Cube的游戏。

     

    22

    首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显示撞击的球体数,12个Cube被撞击后提示游戏结束。

     

    创建项目,创建背景和球

     

    创建一个项目,名称为"MyRollBall",选择项目所在文件,选择"3D"项,点击"Create project"。

     

    点击"File"菜单下的"Save Scene",在"MyRollBall"项目下的"Asserts"中创建一个自定义文件夹,名称是"_MyScene",然后把保存的Scene命名为"MiniGame",并保存到"_MyScene"文件夹中。创建完后,在"Project"窗口下的文件结构如下:

    17

     

    依次点击"GameObject"菜单下的"3D object","Plane",并在"Hierarchy"窗口中重命名为"Ground"。

     

    点击"Hierarchy"窗口中的"Ground",在"Scene"窗口中,Ground自动调整到"Scene"窗口的中心;在"Inspector"窗口的"Transform"中有一个"Reset"按钮,点击它,会把这里的Ground恢复到初始状态;点击"Edit"菜单下的"Frame Selected"会看到"Scene"窗口的整个画面。

     

    此时,"Scene"窗口的背景呈网格状,这里需要隐藏网格。点击"Scene"窗口"Gizmos"下拉项,把"Show Grid"的勾选去掉。

     

    改变Ground的缩放比例,可以通过如下3种方式的一种来做:

    1、点击"Hirarchy"窗口中的Ground,按快捷键R,通过拖动"Scene"窗口中Ground的x,z轴来实现。
    2、点击"Hirarchy"窗口中的Ground,无需按哪个视图快捷键,把鼠标移上"Inspector"窗口中,"Transform"下的"Scale"中的"X"字母或"Z"字母上,通过鼠标的左右滑动来改变缩放。
    3、直接修改"Inspector"窗口中,"Transform"下的"Scale"中"X"和"Z"的属性值。

     

    注意:这里的Ground,即类型为"plane"的GameObject,沿y轴方向正向调整不会影响Ground的可见性,一旦拖动Y轴,让Y轴对应的值为负值,Ground随即不可见。这里给我们的启示是:如果一个GameObject不可见,我们可以调整该GameObject的Y值,来使其可见。


    现在再增加一个球体。在"GameObject"菜单栏的"3D Object"中选择"Sphere",在"Hierarchy"窗口为Sphere重命名为"Player"。

     

    在保证"Hierarchy"窗口为Sphere为选中状态下,点击"Edit"菜单下的"Frame Selected",Sphere在Scene窗口中出现在焦点位置,并呈选中状态。

    18

     

    但是,我们发现球体的位置不太对,所以要调整球体的位置。拖动"Scene"窗口中Sphere的y轴,使其往上移动,让整个球体在水平面之上。当然调整"Inspector"中的相关属性也是可以的。

     

    在"Project"下的"Asserts"中添加名称为"Materials"的Folder。

     

    选中"Mateirals"这个Folder,右键,依次选择"Create","Material",这样在"Mateirals"这个Folder中添加了一个名称为"New Mateiral"的Material,并重命名为"Background"。

     

    修改名称为"Background"的"Inspector"窗口中的"Albedo"项,修改RGB属性值为"0,32,64",可以在"Inspector"窗口的最下方预览到效果。接着拖动这里的"Background"到"Scene"窗口的"Ground"上面,"Ground"因此有了Material。

    19

     

    点击"Hierarchy"窗口下的"Directional Light",修改"Inspector"窗口中"Rotation"的"Y"为60。

     

    移动球

     

    在"Hierarchy"窗口中选择名称为"Player"的GameObject。

     

    为了能够让名称为"Player"的GameObject运动,需要为其添加"RigidBody"。

     

    依次选择"Component"菜单、"Physics"、"RigidBody",之后,在"Inspector"窗口多了一个"Rigidbody"组件。当然,为GameObject添加组件Compnenet的方式不止这一种,可以点击"Inspector"窗口的"Add Component"按钮。还可以在"Inspector"窗口中调整各个组件的顺序。还可以折叠或展开各个组件面板。

     

    选中"Project"下的"Asserts",添加一个"Scripts"文件夹。

     

    再次选中"Hierarch"中的"Player",在其对应的"Inspector"窗口中点击"Add Component"按钮,点击"New Script",命名为"PlayerController"。按这种方式添加的脚本自动附加到GameObject上了。而在"Asserts"下也多了一个名称为"PlayerController"的脚本,为了把文件夹组织得更好,把该脚本拖入刚创建的"Scripts"文件夹。

     

    双击脚本,在Visutal Studio中打开,编辑如下:

     

    using UnityEngine;
    
    using System.Collections;
    
    public class PlayerController : MonoBehaviour
    
    {
    
        public float speed;
    
        private Rigidbody rb;
    
        void Start ()
    
        {
    
            rb = GetComponent<Rigidbody>();
    
        }
    
        void FixedUpdate()
    
        {
    
            float moveHorizontal = Input.GetAxis("Horizontal");
    
            float moveVertical = Input.GetAxis("Vertical");
    
            Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
    
            rb.AddForce(movement * speed);
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
        
    
        }
    
    }
    
    
    


    可以在官网查看到所有的API:http://docs.unity3d.com/ScriptReference

     

    再次点击"Hirarchy"下的"Player",在其对应的"Inspector"窗口下的"Player Controller"这个脚本中,调整Speed的属性值,设置为100。

     

    运行。

     

    按动键盘方向键,球以某种速度移动起来。

     

    移动Camera

     

    现在想把Camera附加到球体上。

     

    首先设置Camera的位置。

     

    在MainCamera对应的"Inspector"窗口中,在"Transform"下,调整"Position"的x,y,z分别为"0,10,-10",调整"Rotation"的x,y,z分别为"45,0,0",再在"Hierarchy"窗口中把"Main Camera"拖动到"Player"上,使其成为"Player"的一个子GameObject。这意味着当球体移动的时候,Camera也会跟着移动。

     

    再次运行,这次看到球体移动非常快,这是因为Camera的位置相对于球体变化了。

     

    在"Hierarch"窗口中,把"Main Camera"移动出"Player",不要让其成为球体的子GameObject。

     

    为"Main Camera"添加一个名称为"CameraController"的脚本,编辑如下:

     

    using UnityEngine;
    
    using System.Collections;
    
    public class CameraController : MonoBehaviour {
    
        //说明这个Camera指向于某一个Gameobject,在这里是球体
    
        public GameObject player;
    
        //Camera的偏移量
    
        private Vector3 offset;
    
        void Start()
    
        {
    
            //Camera的位置-球体的位置
    
            offset = transform.position - player.transform.position;
    
        }
    
        void LateUpdate()
    
        {
    
            //让Camera根据球体的位置获得一个新位置
    
            transform.position = player.transform.position + offset;
    
        }
    
    }
    
    
    

     

    好,现在要把球体赋值给Camera。先打开"Main Camera"对应的"Inspector"窗口,然后拖动"Hierarchy"窗口下的名称为"Player"的球体到"Inspector"中"Camera Controller"中"Player"这个属性框上。

     

    运行,这时,球在运动的时候有了一个很好的Camera角度。

     

    设置球体运动区域

     

    为了放置球体在移动过程中掉落,我们需要设置球体的运行区域。

     

    创建一个空的"Game Object",并重命名为"Walls",并把之设置为默认值。

     

    创建一个"Cube"类型的"Game Object",并重命名为"West Wall",并把之设置为默认值,拖动使其成为空"Game Object"的子项。

     

    现在,"Scene"窗口中呈现出如下的位置关系。

    20

     

    这时需要调整Cube的位置,依次创建4个Cube,从4个方向挡住球体。

     

    再次运行,球体被牢牢困在4个cube中间。


    创建被球体撞击的物体

     

    创建一个Cube类型的GameObject,重命名为"Pickup",设置其默认值,点击"Edit"菜单中的"Frame Selected"使其成为"Scene"窗口的焦点。

     

    按如下设置"Pickup"的"Transform"。

    21

     

    现在想为其增加旋转效果。为其专门创建一个名称为"Rotator的脚本"。

     

    using UnityEngine;
    
    using System.Collections;
    
    public class Rotator : MonoBehaviour {
    
        // Use this for initialization
    
        void Start () {
    
        
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
            transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
    
        }
    
    }
    
    
    


    运行,"Pickup"会不停地旋转。

     

    在"Project"窗口中,在"Asserts"下创建"Prefabs"文件夹。

     

    把"Hierarchy"中的"Pickup"拖动到"Prefabs"文件夹中。

     

    创建一个空的GameObject,重命名为"Pickups",设置默认值。

     

    把"Asserts"中"Prefabs"中的"Pickup"拖动到"Pickups"中,作为子GameObject。

     

    选中"Hierarchy"窗口中的"Pickup",选择左上角的"Local"模式,拖动"Pickup"到一个合适的位置。

     

    复制"Pickup"12个,围成一个圈。

     

    在"Project"窗口中的"Material"文件夹中再复制一个,重命名为"Pickup",改变其颜色为黄色。

     

    把其拖动到"Scene"窗口中的各个"Pickup",这时,所有的"Pickup"呈现为黄色。

     

    撞击物体

     

    修改脚本"PlayerController"。

     

    using UnityEngine;
    
    using System.Collections;
    
    public class PlayerController : MonoBehaviour
    
    {
    
        public float speed;
    
        private Rigidbody rb;
    
        void Start ()
    
        {
    
            rb = GetComponent<Rigidbody>();
    
        }
    
        void FixedUpdate()
    
        {
    
            float moveHorizontal = Input.GetAxis("Horizontal");
    
            float moveVertical = Input.GetAxis("Vertical");
    
            Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
    
            rb.AddForce(movement * speed);
    
        }
    
        //Collider表示被球体碰撞的其它物体
    
        void OnTriggerEnter(Collider other)
    
        {
    
            if (other.gameObject.CompareTag("Pick Up"))
    
            {
    
                other.gameObject.SetActive(false);
    
            }
    
        }
    
        
    
        // Update is called once per frame
    
        void Update () {
    
        
    
        }
    
    }
    
    
    

     

    回到Unity界面,选择"Project"界面上"Prefabs"文件夹内的"Pickup",在"Inspector"窗口加添加"Pick Up"标签。

     

    运行,控制键盘方向键,当物体碰撞到Cube上的时候,Cube没有消失。这不是我们所期望的。

     

    回到Unity界面,选择"Project"界面上"Prefabs"文件夹内的"Pickup",在"Inspector"窗口,在"Box Collider"中,勾选"Is Trigger"。

     

    运行,控制键盘方向键,当物体碰撞到Cube上的时候,Cube消失。这正是我们所期望的。

     

    所有的带Rigid Body的Game Object被Unity理解为dynamic,不带Rigid Body的Game Object被Unity理解成为static。如果没有把Game Object附加Rigid Body的话,Unity在每一帧都会统计这些static Game Object,这非常消耗资源。所以,我们应当为Game Object附加Rigid Body,让其变成dynamic。static是不可以移动的,而dynamic是可以移动的。


    回到Unity界面,选择"Project"界面上"Prefabs"文件夹内的"Pickup",在"Inspector"窗口,点击"Add Component"按钮,为其添加Rigid Body组件。

     

    再次运行,发现所有的Cube消失了,为什么?

    回到Unity界面,选择"Project"界面上"Prefabs"文件夹内的"Pickup",在"Inspector"窗口,把"Rigid Body"中"Use Gravity"的勾选去掉。

     

    再次运行,正常运行。


    显示分数

     

    在"Hierarch"窗口中添加Text,Text作为Canvas的子Game object出现,并重命名为"Counter Text"。选择Text,改变其字体颜色为白色,同时按住"alt"+"shift"键,改变Text的位置

     

    在"Hierarch"窗口中添加Text,Text作为Canvas的子Game object出现,并重命名为"Win Text"。选择Text,改变其字体颜色为白色。

     

    修改"PlayerController"脚本。

     

    using UnityEngine;
    
    using System.Collections;
    
    using UnityEngine.UI;
    
    public class PlayerController : MonoBehaviour
    
    {
    
        public float speed;
    
        public Text countText;
    
        public Text winText;
    
        private Rigidbody rb;
    
        private int count;
    
        void Start()
    
        {
    
            rb = GetComponent<Rigidbody>();
    
            count = 0;
    
            SetCountText();
    
            winText.text = "";
    
        }
    
        void FixedUpdate()
    
        {
    
            float moveHorizontal = Input.GetAxis("Horizontal");
    
            float moveVertical = Input.GetAxis("Vertical");
    
            Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
    
            rb.AddForce(movement * speed);
    
        }
    
        void OnTriggerEnter(Collider other)
    
        {
    
            if (other.gameObject.CompareTag("Pick Up"))
    
            {
    
                other.gameObject.SetActive(false);
    
                count = count + 1;
    
                SetCountText();
    
            }
    
        }
    
        void SetCountText()
    
        {
    
            countText.text = "击中了: " + count.ToString() + "个";
    
            if (count >= 12)
    
            {
    
                winText.text = "成功!";
    
            }
    
        }
    
    }
    
    
    

     

    把"Hierarchy"窗口中,"Canvas"下的Text拖拽到"Player"球体对应的"Inspector"窗口内的"Counter Text"和"Win Text"属性值框上。

     

    Build游戏


    选择"File"菜单下的"Build Settings"。

     

    点击"Add Current"按钮,把当前的"Scene"添加进来。

    23

     

    点击"Build"按钮。保存.exe文件保存到某个位置。

     

    运行可执行文件,即看到与Unity软件中一样的效果。

     

    参考资料:https://unity3d.com/learn/tutorials/projects/roll-a-ball/moving-the-camera

    展开全文
  • http://forum.unity3d.com/threads/getting-impact-force-not-just-velocity.23746/ 转载于:https://www.cnblogs.com/yaohj/p/4896802.html

    http://forum.unity3d.com/threads/getting-impact-force-not-just-velocity.23746/

    转载于:https://www.cnblogs.com/yaohj/p/4896802.html

    展开全文
  • 角色撞击物体弹出提示框效果如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少...
  • Stay,撞击物体变形、弹开的过程 Exit,碰撞物体分离的第一帧 触发器 【Is Trigger】 是否开启触发器(作用力效果),开启后物体失去碰撞效果,但仍会发送碰撞消息。 【Size】 物体碰撞作用的体积 碰撞消息...
  • 在《【Fracturing & Destruction】Unity3D物体爆裂、炸裂、碎裂效果》(点击打开链接)提到了Unity3D物体爆裂、炸裂、碎裂效果到底是用哪些组件去制作的,但是只是提到如果制作一个碰撞时的击碎效果,当然这也是...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class Destroy : MonoBehaviour { private Transform m_transform;... // Use this for initialization ...
  • Unity撞击Bug示例Unity版本编号刚体撞击Bug说明Unity发生碰撞的必要条件Bug场景重现Bug总结 Unity版本编号 在最近练习unity相关项目时发现一个BUG(暂且这样认为),我的Unity版本是最新的2019.3.14f1。 (说明:该实验...
  • 检测碰撞有两种方式,一种是利用碰撞器,另外一种就是触发器。 碰撞器的种类: 1.Static Collider 静态碰撞器 ...指的是相互碰撞的两个物体没有...在静态碰撞器的基础上,处于运动状态的物体必须要附加刚体组件和带
  • GameObject加了rigidbody之后,与其他物体碰撞会产生力矩从而
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 cube cylinder sphere plane quad ...
  • untiy3d初学者,做一个2D乒乓球项目(就是在一个两块板,可以上下移动来弹一个球![图片说明](https://img-ask.csdn.net/upload/201711/28/1511843195_416476.png)),球开始速度代码ball.velocity = Vector2.right *...
  • Unity物体破碎效果

    2019-05-28 17:29:55
    &nbsp;&nbsp;&nbsp;&nbsp;物体破碎的效果在游戏中非常常见,在本文中将实现任意大小的长方体的敲击破碎,并为实现更复杂物体的破碎效果做好铺垫。...在Unity中,物体的形状是由Me...
  • 在开发时,我遇到了旋转某个物体的子物体时发生形变的bug,如图 显然,这不是我想要的结果 我找到了这样一篇解决方案: https://blog.csdn.net/qq_15267341/article/details/76730362 可行是可行,不过里面...
  • 1.被Cube (3)碰撞的碰撞体变原谅色 2.脚本添加在其它Cube上,而不是Cube (3) using System.Collections; using System.Collections.Generic; using UnityEngine; public class ChangeColor : MonoBehaviour { ...
  • 本文档为unity小球碰撞游戏过程以及代码。教程。即从创建项目到整个游戏开发完成的过程以及详细代码
  • 这次使用了类似于链表的结构,将每个物体分在分割的地图中以链表的形式储存计算新的位置,中间有几个cs文件是不必要的,但是不要删除,除非是自己将引用剔除掉,实现起来看我的截图吧,帧数还可以,我会继续努力的,...
  • using UnityEngine; using System.Collections; // 主界面的开始按钮使用该脚本,控制上下来回浮动 public class Floating : MonoBehaviour { float radian = 0; // 弧度 float perRadian = 0.03f;...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class Collisiotest : MonoBehaviour { private Renderer fuck; // Use this for initialization ...
1 2 3 4 5 ... 14
收藏数 275
精华内容 110
关键字:

unity3d 物体撞击