拍摄射弹时我执行
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
方法,因为我没有销毁该对象,我将其回收并禁用渲染器。
当用射弹击中物体时,这种射弹应该被反射。
我射了一堵墙,这些墙多次反射了这些物体
我认为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
的参数?我似乎必须旋转它改变其运动方向的抛射物。
答案 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);
}
}
这对我来说很好用