Моя пуля появляется случайным образом и не наносит ущерба - PullRequest
0 голосов
/ 12 декабря 2018
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;

}

} `

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

1 Ответ

0 голосов
/ 12 декабря 2018

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

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

...