统一限制飞机上的移动物体

时间:2018-05-31 08:53:35

标签: c# unity3d

我想限制飞机上的移动物体(飞机可能是或不是正方形)这里是原型:

enter image description here

我将一个网格对撞机附加到平面上,并希望用它来限制球体随机移动的球体运动,这个想法是当球移动到边缘时,速度会被反射,所以它不会掉落离开飞机这个:

public class BallScript : MonoBehaviour {

    // Use this for initialization
    void Start () {
        GetComponent<Rigidbody>().velocity = new Vector3(0.1f,0,0.1f);

    }

    private void OnCollisionExit(Collision collision)
    {
        GetComponent<Rigidbody>().velocity = -GetComponent<Rigidbody>().velocity;
    }
}

但球保持在边缘,

我无法制作边缘碰撞器导致飞机的形状直到运行时才会被确定。

有办法吗?

3 个答案:

答案 0 :(得分:2)

当对象不再与另一个对象发生碰撞时,将调用OnCollisionExit函数。在你的情况下,当球位于飞机的边缘但是当球不再接触飞机时,它将被调用。

最安全的方法是使用BoxCollider。我建议你只使用Unity的Cube原语,它附带一个BoxCollider。它上面的网格很有用,在调整BoxCollider大小时应该作为视觉指南。

1 。转到 GameObject ---&gt; 3D对象 ---&gt; Cube 并创建新的多维数据集对象。观察飞机的形状,您需要 6 BoxColliders,这意味着您需要6个立方体。

2 。重新调整,移动并旋转每个直到它们覆盖飞机的每一侧。

3 。创建新图层并调用它&#34; Boundary&#34;。选择每个立方体并将图层设置为&#34; Boundary&#34;。

4 。转到编辑 ---&gt; 项目设置 ---&gt; 物理并使用图层碰撞矩阵来确保&#34;边界&#34;不能与&#34;边界&#34;碰撞。

5 。禁用或删除每个多维数据集的MeshRenderer以及那个。

您的问题中的代码是不必要的,但如果您仍希望它反映出来,请使用OnCollisionEnter并检查球何时撞到墙上。

接球:

Rigidbody rb;
public float force = 50;

void Start()
{
    rb = GetComponent<Rigidbody>();
}
void OnCollisionEnter(Collision col)
{
    if (col.collider.CompareTag("Boundary"))
        rb.AddForce(col.contacts[0].normal * force, ForceMode.Impulse);
}

答案 1 :(得分:1)

所以这只是一个想法,因为OP同意将此作为答案

 public Layer[] layerPriorities =
{
    Layer.Enemy,
    Layer.Walkable
};

 [SerializeField] float distanceToBackground = 100f;

public delegate void OnLayerChange(Layer newLayer); // declare new delegate type
//lets use event for the protection of the layerchanges
public event OnLayerChange onlayerChange; // instantiate a observer set

//Look for and return priority layer hit
    foreach (Layer layer in layerPriorities)
    {
        var hit = RaycastForLayer(layer);
        if (hit.HasValue)
        {
            raycastHit = hit.Value;
            if(layerHit != layer){ //if layer has changed
                layerHit = layer;
                onlayerChange(layer); //call the delegate
            }
            layerHit = layer;
            return;
        }
    }
    // otherwise return background hit
    raycastHit.distance = distanceToBackground;
    layerHit = Layer.RaycastEndStop;

}
//? is a nullable parameter
RaycastHit? RaycastForLayer(Layer layer)
{
    /*(Use a bitshift) <<*/
    int layerMask = 1 << (int)layer; // lets do masking formation
    Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);

    RaycastHit hit; //used as an out parameter
    bool hasHit = Physics.Raycast(ray, out hit, distanceToBackground, layerMask);
    if (hasHit)
    {
        return hit;
    }
    return null;
}

并为该

创建一个枚举
public enum Layer
{
    Walkable = 8,
    RaycastEndStop = -1 //lowest priority
}

作为Layer.Enemy,您可以将其设置为NotWalkable,这取决于您。

因此,这里的小缺失部分只是计算球与飞机边缘的距离而不是点击它。这就是我告诉你的关于SqrMagnitude

的内容

答案 2 :(得分:0)

据我了解,如果你能够生成边缘对撞机朗姆酒,你的问题就会得到解决。我从另一个论坛找到了这个答案。这似乎是你正在寻找的答案。希望它有所帮助。

how to create change edge collider from code