子弹即使附加了刚体组件,也要经过Unity3d Survival Shooter项目中的游戏对象

问题描述 投票:0回答:1

在“生存射击游戏”中,我有一个敌人对象,并添加了自己的3d游戏对象一切工作正常,游戏对象正在跟随并伤害玩家,但是当玩家射击游戏对象时,子弹穿过游戏对象并且得分也不会增加。我已将刚体组件附加到我的自定义3d游戏对象上,但子弹仍然不会造成任何损坏。

This is the code for PlayerShooting
using UnityEngine;

public class PlayerShooting : MonoBehaviour
{
    public int damagePerShot = 20;
    public float timeBetweenBullets = 0.15f;
    public float range = 100f;


    float timer;
    Ray shootRay;
    RaycastHit shootHit;
    int shootableMask;
    ParticleSystem gunParticles;
    LineRenderer gunLine;
    AudioSource gunAudio;
    Light gunLight;
    float effectsDisplayTime = 0.2f;


    void Awake ()
    {
        shootableMask = LayerMask.GetMask ("Default");
        shootableMask = LayerMask.GetMask ("Default");
        shootableMask = LayerMask.GetMask("Default");
        shootableMask = LayerMask.GetMask("Default");
        gunParticles = GetComponent<ParticleSystem> ();
        gunLine = GetComponent <LineRenderer> ();
        gunAudio = GetComponent<AudioSource> ();
        gunLight = GetComponent<Light> ();
    }


    void Update ()
    {
        timer += Time.deltaTime;

        if(Input.GetButton ("Fire1") && timer >= timeBetweenBullets)
        {
            Shoot ();
        }

        if(timer >= timeBetweenBullets * effectsDisplayTime)
        {
            DisableEffects ();
        }
    }


    public void DisableEffects ()
    {
        gunLine.enabled = false;
        gunLight.enabled = false;
    }


    void Shoot ()
    {
        timer = 0f;

        gunAudio.Play ();

        gunLight.enabled = true;

        gunParticles.Stop ();
        gunParticles.Play ();

        gunLine.enabled = true;
        gunLine.SetPosition (0, transform.position);

        shootRay.origin = transform.position;
        shootRay.direction = transform.forward;

        if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
        {
            EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
            if(enemyHealth != null)
            {
                enemyHealth.TakeDamage (damagePerShot, shootHit.point);
            }
            gunLine.SetPosition (1, shootHit.point);
        }
        else
        {
            gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range);
        }
    }
}

下面是敌人的健康脚本:

    using UnityEngine;

public class EnemyHealth : MonoBehaviour
{
    public int startingHealth = 100;
    public int currentHealth;
    public float sinkSpeed = 2.5f;
    public int scoreValue = 10;
    public AudioClip deathClip;


    Animator anim;
    AudioSource enemyAudio;
    ParticleSystem hitParticles;
    CapsuleCollider capsuleCollider;
    bool isDead;
    bool isSinking;


    void Awake ()
    {
        anim = GetComponent <Animator> ();
        enemyAudio = GetComponent <AudioSource> ();
        hitParticles = GetComponentInChildren <ParticleSystem> ();
        capsuleCollider = GetComponent <CapsuleCollider> ();

        currentHealth = startingHealth;
    }


    void Update ()
    {
        if(isSinking)
        {
            transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime);
        }
    }


    public void TakeDamage (int amount, Vector3 hitPoint)
    {
        if(isDead)
            return;

        enemyAudio.Play ();

        currentHealth -= amount;

        hitParticles.transform.position = hitPoint;
        hitParticles.Play();

        if(currentHealth <= 0)
        {
            Death ();
        }
    }


    void Death ()
    {
        isDead = true;

        capsuleCollider.isTrigger = true;

        anim.SetTrigger ("Dead");
        ScoreManager.score += scoreValue;
        enemyAudio.clip = deathClip;
        enemyAudio.Play ();
    }


    public void StartSinking ()
    {
        GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false;
        GetComponent <Rigidbody> ().isKinematic = true;
        isSinking = true;
        ScoreManager.score += scoreValue;
        Destroy (gameObject, 2f);
    }
}
c# unity3d game-development
1个回答
0
投票
如果显示子弹的线正穿过敌人的游戏对象,那么您的Physics.Raycast正在

不击中该游戏对象的对撞机。您可以通过如下向raycast块中添加一些Debug输出来快速进行测试:

if(Physics.Raycast (shootRay, out shootHit, range, shootableMask)) { Debug.Log("I HIT SOMETHING CALLED: " + shootHit.collider.gameObject.name); EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> (); if(enemyHealth != null) { enemyHealth.TakeDamage (damagePerShot, shootHit.point); } gunLine.SetPosition (1, shootHit.point); } else { Debug.Log("I DIDN'T HIT ANYTHING!"); gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range); }

可疑
,您的问题是敌人的游戏对象位于“默认”层上。

在Awake方法中,您按照shootableMask = LayerMask.GetMask ("Default");的方式设置ShootableMask,然后在调用Physics.Raycast时将其传递给ShootableMask。这实际上是在告诉光线广播ignore

默认层上的所有对象。

尝试将敌人的游戏对象放置在不同的层上。

附带说明,在您的Awake方法中,您只需拥有一次shootableMask = LayerMask.GetMask ("Default");,而无需四次。
© www.soinside.com 2019 - 2024. All rights reserved.