我希望游戏对象围绕其y轴旋转。这个旋转器应该具有初始运动方向,并且当与某物碰撞时,它应该改变其方向。
我创建了一张小图片来展示我的意思,但我想要3D游戏的行为。
所以我刚开始旋转微调器,
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
}
}
如何移动微调器,它沿着一个方向移动,每当它与某个东西发生碰撞时,它就会改变它的方向。它应该永远不会停止移动或旋转。
答案 0 :(得分:2)
如果你给对象一个初始速度,附上一个对撞机,创建物理材质2D并将其分配给对撞机(to apply bounciness),并将碰撞器连接到墙上,你可以让它以最小的代码反弹
private void Start()
{
rigid = GetComponent<Rigidbody>();
rigid.velocity = new Vector3(2f, 3f, 1f) // initialize velocity here
}
答案 1 :(得分:2)
我想指出一些事情:
总而言之,这里的问题是如果你想让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 Combine
和Bounce Combine
你可以避免在碰撞过程中失去的力量,所以你不需要添加我在第二步中提到的外力。但是我从未尝试过这个。
让我知道它是否有效。在我到家之前,我无法尝试自己的解决方案。