Как добавить силу к объекту после столкновения в unity2d, чтобы имитировать удар бейсбольной битой - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над проектом 2D-игры. Я бы хотел, чтобы пользователь мог ударить по мячу, когда он нажимает клавишу «пробел». Я назначил;

  • Круговой коллайдер 2D и Rigidbody 2D к мячу
  • Rigidbody 2D и Box Collider 2D герою
  • Edge Collider 2D для бейсбольной биты.

Вот мой сценарий, который я назвал «KickTheBall.cs»:

 using UnityEngine;
 using System.Collections;
 public class KickTheBall : MonoBehaviour {
     public float bounceFactor = 0.9f; // Determines how the ball will be bouncing after landing. The value is [0..1]
     public float forceFactor = 10f;
     public float tMax = 5f; // Pressing time upper limit
     private float kickStart; // Keeps time, when you press button
     private float kickForce; // Keeps time interval between button press and release 
     private Vector2 prevVelocity; // Keeps rigidbody velocity, calculated in FixedUpdate()
     [SerializeField]
     private EdgeCollider2D BatCollider;
     private Rigidbody2D rb;
     void Start () {
         rb = GetComponent<Rigidbody2D>();
     }
     void FixedUpdate () {
         if(kickForce != 0)
         {
             float angle = Random.Range(0,20) * Mathf.Deg2Rad;
             rb.AddForce(new Vector2(0.0f, 
                 forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax) * Mathf.Sin(angle)), 
                 ForceMode2D.Impulse); 
             kickForce = 0;
         }
         prevVelocity = rb.velocity;
     }
     void Update(){
         if(Input.GetKeyDown (KeyCode.Space))
         {
             kickStart = Time.time;
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
             RaycastHit hit;
             if (Physics.Raycast(ray, out hit))
             {
                 if(hit.collider.name == "Ball") // Rename ball object to "Ball" in Inspector, or change name here
                     kickForce = Time.time - kickStart;
             }
         }
     }

     public void KickBall(){
         BatCollider.enabled = true;
     }
     void OnCollisionEnter(Collision col)
     {
         if(col.gameObject.tag == "Ground") // Do not forget assign tag to the field
         {
             rb.velocity = new Vector2(prevVelocity.x, 
                 -prevVelocity.y * Mathf.Clamp01(bounceFactor));
         }
     }
 }

Однако я не могу ударить по мячу, когда нажимаю клавишу пробела. Мяч просто подпрыгивает из-за коллайдеров. Чего мне не хватает?

Проверьте мой результат:

.gif image

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я решил проблему с помощью @TylerSigi. Я обновил свой файл скрипта следующими кодами:

using UnityEngine;
using System.Collections;

public class KickTheBall : MonoBehaviour {
    public float forceFactor = 10f;
    private float kickForce = 0f; 
    private EdgeCollider2D BatCollider;
    public GameObject Ball;

    void Start () {

    }

    void Update()
    {
        if (Input.GetKey (KeyCode.Space)) {
            kickForce = 1000;
        } else {
            kickForce = 0;
        }
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if(col.gameObject.tag == "Enemy") // Do not forget assign tag to the field
        {
            Ball.GetComponent<Rigidbody2D>().AddForce(transform.right * kickForce);
        }
    }

}
0 голосов
/ 10 мая 2018

Я бы начал с чего-то большего. Это сценарий, который вы бы добавили на свою бейсбольную биту.

Часть 1:

 using UnityEngine;
 using System.Collections;
 public class KickTheBall : MonoBehaviour 
 {
     public float forceFactor = 10f;
     private float kickForce = 50f; 

     void OnCollisionEnter(Collision col)
     {
         if(col.gameObject.tag == "Ball") // Do not forget assign tag to the field
         {
             rb = col.gameobject.GetComponent<Rigidbody>();    
             rb.AddForce(transform.right * kickForce);
         }
     }
 }

Я упростил вашу функцию AddForce для демонстрационных целей. Не стесняйтесь заменить его более сложной функцией AddForce, если все работает.

Часть 2:

Если вы действительно хотите включить часть, в которой нажатие клавиши пробела усиливает удар, добавьте следующее:

 void Update()
 {
     if(Input.GetKey(KeyCode.Space))
     {
         kickForce += 0.5f;
     }
 }

и добавьте в конце oncollisionenter

   kickForce = 0;

Что это будет делать, это наращивать силу, пока вы удерживаете кнопку пробела. После успешного удара сила сбрасывается до 0. Поэтому последующие столкновения не приведут к удару, пока кнопка пробела не будет удержана снова.

Дайте мне знать, если это что-то для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...