在Unity中创建一个无尽的微调器

时间:2017-08-22 20:18:14

标签: c# unity3d

我希望游戏对象围绕其y轴旋转。这个旋转器应该具有初始运动方向,并且当与某物碰撞时,它应该改变其方向。

我创建了一张小图片来展示我的意思,但我想要3D游戏的行为。

enter image description here

所以我刚开始旋转微调器,

public class Spinner : MonoBehaviour
{
    [SerializeField]
    private float movementSpeed; // speed when moving

    [SerializeField]
    private float rotationSpeed; // speed when rotating

    private Rigidbody rigid;
    private Vector3 movementDirection; // the direction the spinner is moving

    private void Start()
    {
        rigid = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        transform.Rotate(0, rotationSpeed, 0); // rotate the spinner around its y-axis
    }

    private void OnCollisionEnter(Collision col)
    {
        // set new direction
    }

}

如何移动微调器,它沿着一个方向移动,每当它与某个东西发生碰撞时,它就会改变它的方向。它应该永远不会停止移动或旋转。

2 个答案:

答案 0 :(得分:2)

如果你给对象一个初始速度,附上一个对撞机,创建物理材质2D并将其分配给对撞机(to apply bounciness),并将碰撞器连接到墙上,你可以让它以最小的代码反弹

private void Start()
{
    rigid = GetComponent<Rigidbody>();
    rigid.velocity = new Vector3(2f, 3f, 1f) // initialize velocity here
}

答案 1 :(得分:2)

我想指出一些事情:

  • Unity物理引擎会发生碰撞以吸收部分移动旋转器的力,所以除非你继续添加&#34; artificial&#34;迫使旋转器最终停止。
  • &#34;空气摩擦&#34;在你的场景中也会减少你的力量 旋转器,所以它会减慢速度。你应该添加一个材料 具有0动态摩擦力的微调器
  • 根据您在@ reymoss&#39;中留下的评论回答,你可以考虑一下 将弹性材料添加到墙壁上,而不是旋转 游戏对象。

总而言之,这里的问题是如果你想让GameObject使用物理引擎反弹到墙上,物体最终会停止,因为在每次碰撞中都会吸收一些力。这意味着每次发生碰撞时你都需要不断增加外力,以使它无休止地移动。

你可以试试的是,

1-在墙壁上添加弹性材料,消除旋转器的动态摩擦。在以下链接中,您可以了解:

https://docs.unity3d.com/Manual/class-PhysicMaterial.html

2-向Spinner添加一个碰撞器,所以当它检测到与墙壁发生碰撞时(例如你可以用这样的方式标记墙壁)在旋转器已经移动的方向上增加一个额外的力,所以它会补偿碰撞过程中损失的能量。

void OnTriggerExit(Collider other) {
    if(other.tag == "wall") {
         rigidbody.AddForce(rigidbody.velocity.normalized * Time.deltaTime * forceAmount);    
    } 
}

想法是让引擎在与墙壁碰撞后决定旋转器的方向,并且一旦GameObject离开触发器,就会在当前方向上添加额外的力。

然后你可以使用Bounciness墙的材质和forceAmount,直到你的微调器移动为止。

注意:由于你将有两种材料,一种在墙上,另一种在旋转器中,也许玩Friction CombineBounce Combine你可以避免在碰撞过程中失去的力量,所以你不需要添加我在第二步中提到的外力。但是我从未尝试过这个。

让我知道它是否有效。在我到家之前,我无法尝试自己的解决方案。