我想限制飞机上的移动物体(飞机可能是或不是正方形)这里是原型:
我将一个网格对撞机附加到平面上,并希望用它来限制球体随机移动的球体运动,这个想法是当球移动到边缘时,速度会被反射,所以它不会掉落离开飞机这个:
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;
}
}
但球保持在边缘,
我无法制作边缘碰撞器导致飞机的形状直到运行时才会被确定。
有办法吗?
答案 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)
据我了解,如果你能够生成边缘对撞机朗姆酒,你的问题就会得到解决。我从另一个论坛找到了这个答案。这似乎是你正在寻找的答案。希望它有所帮助。