如何根据对撞机及其坐标正确穿孔和堆叠目标?

我正在制作另一个简单的游戏,一个捕获游戏,在这个游戏中,一个产卵的目标游戏对象必须使用一串串来捕获。 这里如何:

  1. 在开始的时候,落在下面的物体( 红色 )将会在垂直方向( 蓝色在这里输入图像描述

  2. 如果瞄准得当,目标将沿着串线下降。 ( 蓝色 )然后,另一个目标会产生并垂直下降。 ( 红色在这里输入图像描述

  3. 当再次瞄准连胜时,第二个目标将沿着串烧落下。 当另一个目标产生时,一遍又一遍的相同过程。 在这里输入图像描述

然而,当我testing在Unity的场景选项卡上运行它时,当刺穿几个目标,而不是一个平稳的stream量和堆叠它结束了它,而不是像一个煎饼堆叠起来。 这是它的样子: 在这里输入图像描述

正如我在达到我的进展的一半时注意到的那样,我试图弄清楚如何处理碰撞体而不会互相粘连,以便像实际的图像一样堆叠。 3.以下是我在目标游戏对象中添加的脚本代码:

using UnityEngine; using System.Collections; public class ImpaleStateTest : MonoBehaviour { public GameObject target; public GameObject skewer; public bool drag = false; private float stack; private float impaleCount; void Start () { stack = 0; impaleCount = 0; } void Update () { if(drag) { target.transform.position = new Vector3 (DragTest.dir.transform.position.x, DragTest.dir.transform.position.y - 0.35f, 0); target.transform.rotation = DragTest.degrees; target.rigidbody2D.fixedAngle = true; target.rigidbody2D.isKinematic = true; target.rigidbody2D.gravityScale = 0; if(Input.GetMouseButton(0)) { Debug.Log ("Skewer: " + DragTest.dir.transform.position.x); Debug.Log ("Target: " + target.transform.position.x); } } } void OnTriggerEnter2D(Collider2D collider) { impaleCount++; Debug.Log ("Impaled " + impaleCount + " time(s)!"); drag = true; audio.Play (); } } 

除此之外,我不确定是否正确,但是在向左或向右拖动扦子时粘住被刺穿目标的唯一方法是仅从扦子中获取X坐标。 还有什么其他的建议,以尽可能现实地改善这种行为? 请帮忙。

你正在使用OnTriggerEnter2D ,所以我想你正在使用触发器OnTriggerEnter2D 。 触发器不会因碰撞而受到影响,反而会将消息发送到脚本上,并与游戏对象发生碰撞。

所以,如果你想让你的“圈子”碰撞,你应该使它们不触发。

堆叠问题

关于堆叠问题,我不确定你的课程是如何设置的,但我会考虑根据索引方法处理堆叠元素的位置。

对于实例(伪代码):

 class Skewer : MonoBehaviour { public List<SkewerElements> skewerElements = new List<SkewerElements>(); public float skewerElementHeight = 1; // public void UpdateSkewerPositions() { int count = skewerElements.Count; float yOffset = count * skewerElementHeight; // use an offset to start for(int i = 0; i < count; i++) { // Basically by manipulating the yOffset you can "stack" elements based on the count of elements. skewerElements[i].transform.position = new Vector3(transform.position.x, transform.position.y + (-yOffset + (skewerElementHeight * i)), 0); } } } 

我用了一个负的yOffset,因为如果串y是0.然后我们通过skewerElements的计数向下移动第一个元素。 然后我们通过元素的索引来增加y的高度。

除了引擎,圆形碰撞非常容易编程 – 你可以从头开始。 每个圆形对象都必须有一个Vec2d位置值和一个半径。

在你的更新循环中,遍历所有圆圈的列表,然后testing一下,看是否有任何pos值,> =任何其他值,都是radiai的pos。

如果这是真的,请停止重力作用在正在接触的圆上。 或者,您可以为移动的对象实施排斥力。 请注意,如果两个力(重力和斥力)之间的差值小于1,则必须将它们设置为零,否则它们将会振动。

你会想要一个Vec2d库,除非你想自己运行vectormath(这并不困难)。

至于串:因为你所处理的唯一力量是重力和碰撞,你不必担心任何复杂的物理。 串是一条线,所以你可以通过确定是否有任何一个圆x或y是> =串的位置来testing它的碰撞。

这应该都是非常简单的,如果你需要的细节,评论。