Blender Object with a Box Collider 不会恢复其他物体的运动方向,但一个简单的立方体可以

问题描述 投票:0回答:0

我正在尝试在 3D 中重现类似突破的游戏来学习 Unity。我在搅拌机中设计了我的积木,并将它们作为 .blend 文件导入到 Unity 中。我将 Box Collider 应用于砖块对象。我希望他们在碰撞时恢复球的运动方向。它与球拍和墙壁配合得很好,但是球穿过了砖块,我把球放得特别慢,以确保它不是因为球移动得太快。碰撞被检测到,甚至碰撞时的 Destroy() 也起作用,但改变球的速度却不起作用。我用一个简单的立方体测试了同样的东西,它也能很好地工作。使用搅拌机制作的物体时,我需要考虑什么吗?这是我的球代码:

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

public class Ball : MonoBehaviour
{
    public float maxX;
    public float maxZ;
    private Vector3 velocity;

    private void OnTriggerEnter(Collider other)
    {
        float maxDist = 0.5f * other.transform.localScale.x + 0.5f * transform.localScale.z;
        float actualDist = transform.position.z - other.transform.position.z;
        float distNorm = actualDist / maxDist;
        if (other.CompareTag("Paddle"))
        {
            velocity.z = distNorm * maxZ;
            velocity.x *= -1;
        }
        else if (other.CompareTag("Side Wall"))
        {
            velocity.z *= -1;
        }
        else if (other.CompareTag("Wall"))
        {
            velocity.x *= -1;
        }
        else if (other.CompareTag("Brick"))
        {
            velocity.x *= -1;
            Destroy(other.gameObject);
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        velocity = new Vector3(-maxX, 0, 0);
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += velocity * Time.deltaTime;
     
    }
}

砖块有一个盒子碰撞器(isTrigger 关闭),我也尝试添加一个刚体组件但没有结果。球是一个带有球体对撞机的简单球体,具有“Is Trigger”和具有连续碰撞检测的刚体。

我不知道这是否与问题有关,但我通过脚本生成积木,这是它的代码:

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

public class BrickFactory : MonoBehaviour
{
    public GameObject emptyBrick, 
                      yellowBrick,
                      orangeBrick, 
                      greenBrick, 
                      cyanBrick, 
                      pinkBrick, 
                      purpleBrick, 
                      darkBlueBrick, 
                      redBrick;
    private GameObject[] brickTypes;

    private int[,] level1 = new int[25,10] {
        {8,8,8,8,8,8,8,8,8,8},
        {8,8,8,8,8,8,8,8,8,8},
        {7,7,7,7,7,7,7,7,7,7},
        {7,7,7,7,7,7,7,7,7,7},
        {6,6,6,6,6,6,6,6,6,6},
        {6,6,6,6,6,6,6,6,6,6},
        {5,5,5,5,5,5,5,5,5,5},
        {5,5,5,5,5,5,5,5,5,5},
        {4,4,4,4,4,4,4,4,4,4},
        {4,4,4,4,4,4,4,4,4,4},
        {3,3,3,3,3,3,3,3,3,3},
        {3,3,3,3,3,3,3,3,3,3},
        {2,2,2,2,2,2,2,2,2,2},
        {2,2,2,2,2,2,2,2,2,2},
        {1,1,1,1,1,1,1,1,1,1},
        {6,6,6,6,6,6,6,6,6,6},
        {5,5,5,5,5,5,5,5,5,5},
        {5,5,5,5,5,5,5,5,5,5},
        {4,4,4,4,4,4,4,4,4,4},
        {4,4,4,4,4,4,4,4,4,4},
        {3,3,3,3,3,3,3,3,3,3},
        {3,3,3,3,3,3,3,3,3,3},
        {2,2,2,2,2,2,2,2,2,2},
        {2,2,2,2,2,2,2,2,2,2},
        {1,1,1,1,1,1,1,1,1,1}

     };

    // Start is called before the first frame update
    void Start()
    {
        brickTypes = new GameObject[]{
            emptyBrick,         //empty 0
            yellowBrick,        //yellow 1
            orangeBrick,        //orange 2
            greenBrick,         //green 3
            cyanBrick,          //cyan 4
            pinkBrick,          //pink 5
            purpleBrick,        //purple 6
            darkBlueBrick,      //darkBlue 7
            redBrick            //red 8
        };
        float rowOffset = -7.877f;
        float columnOffset = -7.5f;
        for (int i = 0; i < 25; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if(level1[i, j] != 0)
                {
                    GameObject newBrick = Instantiate(brickTypes[level1[i,j]], new Vector3(columnOffset, 1.28f, rowOffset), Quaternion.identity) as GameObject;
                    newBrick.transform.Rotate(0, 0, 90);
                }
                rowOffset += 1.75f;
            }
            rowOffset = -7.877f;
            columnOffset += 0.6f;
        }
    }

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

还有一个旁注:球在回到球拍并返回砖块后开始神奇地从砖块上弹起。

编辑:我发现这个错误只发生在球沿完美直线移动时,如果我为 velocity.z 设置初始值而不是 x ,则运动方向在第一次碰撞时会正确改变。然而,这不是一个有效的解决方案。会不会是Unity实现碰撞的bug?

c# unity3d blender
© www.soinside.com 2019 - 2024. All rights reserved.