我正在创建2D自上而下的Shooter。我已经知道要让子弹从墙上弹开了,我正在使用OnCollisionEnter2D和苯乙烯2D。子弹在撞墙后确实会反弹,但它们围绕自己的轴旋转。我尝试了很多方法,但无法使这一方法正常工作。
那是实际的样子:
这是我的子弹代码和子弹代码。
public class GunBullet : MonoBehaviour
{
[HideInInspector] public PlayerAvatar ownerPlayerAvatar;
SpriteRenderer spriteRenderer;
public int damage = 15;
[SerializeField] float bulletSpeed;
Rigidbody2D rigidbody;
public void Start()
{
rigidbody = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
rigidbody.velocity = transform.right * BulletSpeed;
}
}
public class RicochetMode : MonoBehaviour
{
Rigidbody2D rigidbody2D;
GunBullet gunBullet;
private void Start()
{
rigidbody2D = transform.root.GetComponent<Rigidbody2D>();
gunBullet = transform.root.GetComponent<GunBullet>();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.layer == LayerMask.NameToLayer("Obstacle"))
{
Debug.Log("RICOCHET");
Vector2 reflectedPosition = Vector3.Reflect(transform.right, collision.contacts[0].normal);
rigidbody2D.velocity = (reflectedPosition).normalized * gunBullet.BulletSpeed;
Vector2 dir = rigidbody2D.velocity;
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
rigidbody2D.MoveRotation(angle);
}
}
}
我希望子弹面朝正确的方向。而且我不想使用统一的2D物理材料。
编辑。
问题解决方案是设置
正如@trollingchar所说,刚性body2D.angularVelocity为零。
答案 0 :(得分:0)
MoveRotation将增量添加到旋转角度。看起来您似乎想要将合成方向设置为angle
,在这种情况下,您将使用僵硬的物体。旋转。
GetComponent<Rigidbody>().rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x)*Mathf.Rad2Deg);
或者,您可以尝试根据碰撞后X或Y速度的变化来反转X或Y变换。
transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
答案 1 :(得分:0)
请检查下面的代码,将其应用于应该具有重力为0的刚体和圆形对撞机2d的子弹
public float speed;
private void Update()
{
transform.Translate(Vector2.up * Time.deltaTime * speed);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.tag == "wall")
{
ContactPoint2D point = collision.contacts[0];
Vector2 newDir = Vector2.zero;
Vector2 curDire = this.transform.TransformDirection(Vector2.up);
newDir = Vector2.Reflect(curDire, point.normal);
transform.rotation = Quaternion.FromToRotation(Vector2.up, newDir);
}
}