主要是利用 Vector3.Reflect 来计算反射方向,然后再给刚体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyBall : MonoBehaviour
{
private Rigidbody rigi;
private Vector3 lateDir;
// Start is called before the first frame update
void Start()
{
rigi = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rigi.velocity = transform.forward * 10;
}
}
private void LateUpdate()
{
lateDir = rigi.velocity;//记录上一帧的速度
}
private void OnCollisionEnter(Collision collision)
{
ContactPoint contactPoint = collision.contacts[0];
Vector3 dir = Vector3.Reflect(lateDir, contactPoint.normal);
if (rigi.useGravity)
{
rigi.useGravity = false;
rigi.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ;
}
rigi.velocity = dir.normalized * lateDir.magnitude;
//绘制
Debug.DrawLine(rigi.position, rigi.position + lateDir, Color.red);
Debug.DrawLine(contactPoint.point, contactPoint.point + contactPoint.normal, Color.yellow);
Debug.DrawLine(contactPoint.point, contactPoint.point + dir, Color.blue);
}
}
墙和球的collider材质给成物理材质:
效果如下: