По какой-то странной причине, когда мой мяч с жестким телом катится ОТ меня, и я «стреляю в него» снарядом с жестким телом, мяч меняет направление и движется ко мне, а не от меня. В противном случае физика работает нормально (если мяч катится к объекту игрока при выстреле снарядом, удар снаряда отскакивает / отбрасывает мяч в правильном направлении / физическом направлении.)
Мой код отскока - прилагается, я использую его для отскока мяча от стен / et c, и он отлично работает. Я полагаю, это потому, что мяч всегда движется к стене, когда ударяется о нее. Я не понимаю, почему, когда я бью по мячу, когда он катится от меня, он немедленно меняет направление. Я пробовал разные массы, сопротивление, физические материалы, гравитацию - все, что я мог придумать, безрезультатно.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BounceBall : MonoBehaviour
{
private Rigidbody rb;
public float bounceForce = 6f;
Vector3 lastVelocity;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void LateUpdate()
{
lastVelocity = rb.velocity;
}
private void OnCollisionEnter(Collision collision)
{
GameObject hitObject = collision.gameObject;
if (hitObject.tag == "Pusher")
{
float speed = lastVelocity.magnitude;
Vector3 direction = Vector3.Reflect(lastVelocity.normalized, collision.contacts[0].normal);
rb.velocity = direction * Mathf.Max(speed, bounceForce * 3.5f);
}
else if (hitObject.tag == "Untagged")
{
float speed = lastVelocity.magnitude;
Vector3 direction = Vector3.Reflect(lastVelocity.normalized, collision.contacts[0].normal);
rb.velocity = direction * Mathf.Max(speed, bounceForce);
}
}
}
И код снаряда (не думайте, что это имеет какое-то отношение к этому)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Projectile : MonoBehaviour
{
public GameObject projectile;
[SerializeField] float projVel = 50f;
[SerializeField] float projLifeTime = 3.5f;
[SerializeField] float projTimer;
private Rigidbody rb;
void Start()
{
rb = projectile.GetComponent<Rigidbody>();
projTimer = projLifeTime;
//rb.AddForce(0,projVel,0, ForceMode.Impulse);
rb.AddForce(transform.forward * projVel, ForceMode.Impulse);
}
private void Update()
{
projTimer -= Time.deltaTime;
if(projTimer <= 0f)
{
Destroy(gameObject);
}
}