Единство - Почему мой мяч катится в противоположном направлении, когда в него попадает снаряд? - PullRequest
1 голос
/ 29 мая 2020

По какой-то странной причине, когда мой мяч с жестким телом катится ОТ меня, и я «стреляю в него» снарядом с жестким телом, мяч меняет направление и движется ко мне, а не от меня. В противном случае физика работает нормально (если мяч катится к объекту игрока при выстреле снарядом, удар снаряда отскакивает / отбрасывает мяч в правильном направлении / физическом направлении.)

Мой код отскока - прилагается, я использую его для отскока мяча от стен / 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);
        }
    }

1 Ответ

1 голос
/ 29 мая 2020

Проблема в методе Vector3.Reflect () . Если вы введете скорость назад, она выдаст скорость движения вперед. Метод Vector3.Reflect () предназначен для объекта, отскакивающего от поверхности или рикошетирующего.

То, что вы хотите сделать, это использовать Rigidbody.AddForce ()

Вот документация: https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

...