Моя пуля появляется случайным образом и не наносит урона

using UnityEngine;    
using System.Collections;
using System;

public class TurretScript : MonoBehaviour
{

public float rangeToPlayer;
public GameObject bullet;
// public GameObject spherePrefab; 
private GameObject player; // Tag for DynamicWaypointSeek
private bool firing = false;  //Firing status
private float fireTime;     // Fire Time
private float coolDown = 1.00F;  // Time to cool down fire
private int health = 5; //Health of turret 
private bool bDead;
private Action cur;

void Start()
{
    player = GameObject.FindWithTag("Player");
    bDead = false;
}



void Update()
{
    if (PlayerInRange())
    {     // PlayerInRange is bool function defined at the end
        transform.LookAt(player.transform.position); //Rotates the transform (weapon) so the forward vector points at /target (Player)/'s current position
        RaycastHit hit;
        if (Physics.SphereCast(transform.position, 0.5F, transform.TransformDirection(Vector3.forward), out hit))
        {  //The center of the sphere at the start of the sweep,The radius of the sphere,The direction into which to sweep the sphere.
            if (hit.transform.gameObject.tag == "Player")
            { //information in hit (only interested in "Player")
                if (firing == false)
                {
                    firing = true;
                    fireTime = Time.time; //keep the current time
                    GameObject bul;
                    Quaternion leadRot = Quaternion.LookRotation(player.transform.position); //Calculate the angular direction of "Player";   
                    bul = Instantiate(bullet, transform.position, leadRot) as GameObject;  // existing object to be copied, Position of Copy, Orientation of Copy
                    //Destroy(bullet, 2.0f); 
                }
            }
        }
    }
    if (firing && fireTime + coolDown <= Time.time) // prvious time stored in fireTime + cool down time is less --> means the firing must be turn off
        firing = false;
   // Destroy(GameObject.FindGameObjectWithTag("Bullet")); 

    if (health <= 0)
        cur = Deadstate;


}

protected void Deadstate()
{
    if (!bDead)
    {
        bDead = true;
        Explode();
    }
}

void Explode()
{
    Destroy(gameObject, 1.5f);

}


bool PlayerInRange()
{
    return (Vector3.Distance(player.transform.position, transform.position) <= rangeToPlayer); //Vector3.Distance(a,b) is the same as (a-b).magnitude.
}

void OnTriggerEnter(Collider col)
{
    HealthBarScript.health -= 10f;

}

}`

Это код, который я написал для вражеской турели в моем текущем проекте Unity. Идея состоит в том, что он будет стрелять в игрока, как только окажется в пределах досягаемости, и остановится, когда он выйдет за пределы досягаемости, и когда пуля сталкивается с игроком, игрок получает урон, но я изо всех сил пытаюсь понять, почему пуля победила. не причиняйте никакого вреда. Мысли? Очень ценю помощь!


person MadDog Gaming    schedule 12.12.2018    source источник
comment
Вы уверены, что это C++, а не Java? Это должен быть самый странный код C++, который я когда-либо видел.   -  person Sam Varshavchik    schedule 12.12.2018
comment
Это не С++ и не Java. Это С#.   -  person Dayan    schedule 12.12.2018
comment
Не знаю почему, это код турели, покажите нам код игрока, где он должен получать урон.   -  person AresCaelum    schedule 12.12.2018
comment
void OnTriggerBullet(Collision coll) { if(coll.gameObject.tag.Equals ("Bullet")) { Destroy(gameObject); } UnityEngine.SceneManagement.SceneManager.LoadScene(levelToLoad); } Это часть сценария моего игрока, где мой игрок встречает пулю. Идея состоит в том, что если в игрока попадает пуля, он уничтожается и запускает экран окончания игры.   -  person MadDog Gaming    schedule 12.12.2018
comment
Некоторым обходным путем было бы добавить BoxCollider (2D, если это 2D-игра) и установить его как триггер, а затем сделать что-то в OnTriggerCollide(2D)   -  person jeuxjeux20    schedule 12.12.2018


Ответы (1)


По моему опыту: скорость пули может быть слишком высокой, чтобы обнаружить столкновение.
Представьте, что в 2D:
кадр 1:
.BB.......OOO..... .
кадр 2:
........BBOOO......
кадр 3:
.. ........OOO..BB..
Где OOO — ваш объект, а BB — ваша пуля.

Чтобы исправить это, у вас может быть больший коллайдер для пули. Также возможны другие обходные пути, такие как «динамический» коллайдер.

person Sereja Nagin    schedule 12.12.2018
comment
Существует также метод raycasting, при котором вы проверяете пространство перед объектом и расстояние, на которое он движется, чтобы проверить наличие препятствий. - person Eliasar; 12.12.2018