首页 > 其他分享 >Unity3D 使用带刚体组件的预制体配合脚本自动生成一面墙时上层墙体被弹飞

Unity3D 使用带刚体组件的预制体配合脚本自动生成一面墙时上层墙体被弹飞

时间:2023-07-23 19:22:32浏览次数:48  
标签:脚本 Unity3D 碰撞 生成 弹飞 预制 using brick 墙时

异常效果如下图所示:

预制体是一个正方体(Cube),其参数设置如下图所示:

控制墙面生成的C#脚本如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wall : MonoBehaviour
{

    public Transform brick;

    // Use this for initialization
    void Start()
    {
        for (int y = 0; y < 3; y++)
        {
            for (int x = 0; x < 3; x++)
            {
                Instantiate(brick, new Vector3(x, y, 0), Quaternion.identity);
            }
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

经过仔细观察,我们发现最底层的那一排砖块没有飞起来,只有上面几排的砖块像是发生的猛烈碰撞被撞飞的现象,认真审查使用预制体控制墙体生成的脚本后,发现刚体结构的砖块在生成到指定坐标位置时,会与已生成的物体出现重叠进而发生碰撞导致弹飞(在3D世界里是会非常严谨地模拟真实世界的),如下图所示:

 主要原因是在生成砖块时,脚本里没有考虑到预制体和墙面生成控制脚本所挂载的物体自身的坐标,导致脚本坐标计算不准确,引发强硬碰撞。考虑好这些方面,重新调整脚本所强硬碰撞就不会发生了,便还是会有轻微的碰撞导致坐标有轻微偏移:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wall : MonoBehaviour
{

    public Transform brick;

    // Use this for initialization
    void Start()
    {
        for (int y = 0; y < 3; y++)
        {
            for (int x = 0; x < 3; x++)
            {
                //将预制体brick的Y坐标也考虑进去,避免强硬碰撞发生
                Instantiate(brick, new Vector3(x, y + brick.position.y, 0), Quaternion.identity);
            }
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

 对于还会发生轻微碰撞的问题,可以将预制体的刚体(Rigidbody)的Position全部冻结来解决:

 

 

标签:脚本,Unity3D,碰撞,生成,弹飞,预制,using,brick,墙时
From: https://www.cnblogs.com/xuruiming/p/17575368.html

相关文章

  • Unity3D 自定义类的数组初始化
    实现功能:1.自定义类,用于保存数据等2.初始化数组代码:publicclasstree_elem{//位置publicintx,y;//大小【相对于原始大小的比例】最后随机分配publicfloatsize;//树的类型,最后随机分配publictree_kindkind;publictree_ele......
  • Unity3D 播放运行时游戏对象往上飞了
    我的原因是不小心给主摄像机(MainCamera)添加了刚体(Rigidbody)组件,导致播放运行时摄像机受重力作用往下掉,造成游戏(Game)视图窗口内看见的游戏对象往上飞了!如下图所示: 把挂在摄像机的上刚体(Rigidbody)组件移除即可!~......
  • unity3d unitywebrequest
    Unity3D中的UnityWebRequest是用于发送HTTP请求和处理HTTP响应的类。它提供了一种方便的方式来从服务器获取数据,例如从Web服务器的数据库中检索数据,并通过HTTP请求将数据发送回Unity3D应用程序。使用UnityWebRequest类,您可以执行以下操作:创建请求:您可以使用UnityWebRequest类......
  • 在Unity3D中使用ScriptableObject进行序列化
    ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法1.usingUnityEngine;......
  • unity3D制作并使用Assetbundles方法
    在网页中为了控制.unity文件的大小,加速载入速度,可以把系统用到的资源制作成Assestbundles,根据需要进行动态的加载和卸载。具体作法:1、使用脚本重新定义系统菜单,添加一个制作Assetbunles的菜单命令://C#Example//Buildsanassetbundlefromtheselected......
  • Unity3D_根据不同的屏幕缩放UI(在横屏上运行竖屏软件)
    一、首先我们创建一个1080*1920分辨率的场景 效果如下二、随便添加一张UI图片三、打包出来看效果(我们发现UI显示不全,这是因为UI的尺寸任然是1080*1920,而我们的电脑是1920*1080) 四、我们在Unity中做以下设置1.选中游戏物体Canvas2.点击组件CanvasScaler上的UISc......
  • Unity3D 游戏实战开发之英雄联盟
    本次游戏项目为类dota游戏中的经典之作《英雄联盟》,向经典致敬。通过本次课程,你会学到网游开发模式、C#服务器开发、协议定制、Unity5.0新特性开发、UGUI应用、同步方案、解决问题思路、各种扩展工具的开发………! 演示地址:www.runruncode.com/video-game/19444.html ......
  • Unity3D高级编程主程手记 学习笔记五:网络通讯
    1.C#实现TCP1.1实现所需APIC#提供了TCP的Socket连接API。一般的游戏项目我们不会使用阻塞方式连接和接收。因为我们不会让游戏卡住等待传输链接,大多数情况下我们还是会使用更加平滑的异步操作作为网络连接和收发的操作。常用的API如下:BeginConnect:开始连接Be......
  • Unity3D如何在一个项目建多个场景
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生设置多个场景您可以添加多个场景、编辑查看场景的方式以及更改场景设置。要创建新场景,请参阅创建、加载和保存场景。添加场景有两种方法可以向项目添加新场景:*右键单击以在“项目”窗口中打开场景资源的菜单......
  • [Unity3D]Unity+Android交互教程——让手机"动"起来
    更多教程请访问:http://dingxiaowei.cn/ 想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是没反应,没办法看源码,结果发现只实现了IOS部分,没有Android部......