反映Unity中碰撞的射弹

时间:2018-04-12 07:43:02

标签: c# unity3d

拍摄射弹时我执行

private Rigidbody rigid;    

private Vector3 currentMovementDirection;

private void FixedUpdate()
{
    rigid.velocity = currentMovementDirection;
}

public void InitProjectile(Vector3 startPosition, Quaternion startRotation)
{
    transform.position = startPosition;
    transform.rotation = startRotation;
    currentMovementDirection = transform.forward;
}

我使用InitProjectile作为我的Start方法,因为我没有销毁该对象,我将其回收并禁用渲染器。

当用射弹击中物体时,这种射弹应该被反射。

我射了一堵墙,这些墙多次反射了这些物体

Reflect

我认为Unity为此提供了一些东西

https://docs.unity3d.com/ScriptReference/Vector3.Reflect.html

触发碰撞时

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject == projectile)
    {
        projectileComponent.ReflectProjectile(); // reflect it
    }
}

我想通过使用

来反映它
public void ReflectProjectile()
{
    // Vector3.Reflect(... , ...);
}

但是我必须使用什么作为Reflect的参数?我似乎必须旋转它改变其运动方向的抛射物。

2 个答案:

答案 0 :(得分:3)

反射弹丸操纵刚体的速度。在这个例子中,我使用一个立方体(上面有这个脚本)作为抛射物和一些立方体围绕它。

没有对撞机被标记为触发器。以下是它的外观:https://youtu.be/2Lfj-li6x8M

public class testvelocity : MonoBehaviour
{
  private Rigidbody _rb;
  private Vector3 _velocity;

  // Use this for initialization
  void Start()
  {
    _rb = this.GetComponent<Rigidbody>();

    _velocity = new Vector3(3f, 4f, 0f);
    _rb.AddForce(_velocity, ForceMode.VelocityChange);
  }

  void OnCollisionEnter(Collision collision){
    ReflectProjectile(_rb, collision.contacts[0].normal);
  }

  private void ReflectProjectile(Rigidbody rb, Vector3 reflectVector)
  {    
        _velocity = Vector3.Reflect(_velocity, reflectVector);
    _rb.velocity = _velocity;
  }
}

答案 1 :(得分:1)

我尝试使用Raycast的另一种方法

public void ReflectProjectile()
{
    RaycastHit hit;
    Ray ray = new Ray(transform.position, currentMovementDirection);

    if (Physics.Raycast(ray, out hit))
    {
        currentMovementDirection = Vector3.Reflect(currentMovementDirection, hit.normal);
    }
}

这对我来说很好用