在Unity3D中,我的敌人在与我的弹丸爆炸碰撞时不会受到伤害。

尽管不是这种情况,但健康变量在与我的弹丸爆炸碰撞时不会受到影响。

我的EnemyBarrel类是从Entity继承的,而Enemy处理损害的处理(从运行状况变量中减去损害变量)。尽管只有桶类可以正常工作。

标记是100%正确的,我希望继续使用继承,所以请不要提出任何建议来更改类遭受破坏的方法。

BarrelEnemy继承的类

using UnityEngine;
using System.Collections;

public class Entity : MonoBehaviour {

    public float health = 25;

// Use this for initialization
void Start () {
}

// Update is called once per frame
void Update () {
}

public virtual void takeDamage(float dmg){
    health -= dmg;

    if (health <= 0){


         Destroy(this.gameObject);
        }
    }
}


Barrel

using UnityEngine;
using System.Collections;

public class Enemy : Entity {
    private NavMeshAgent agent;
    public GameObject target;
    // Use this for initialization
    void Start () {
        agent = GetComponent<NavMeshAgent> ();
    }

    // Update is called once per frame
    void Update () {
        agent.SetDestination (target.transform.position);
    }
}


ExplosionAOE

using UnityEngine;
using System.Collections;

public class Barrel : Entity {

    private Transform myTransform;

    //Effects
    public GameObject barrelExplosion;
    public GameObject explosionDamage;
    public GameObject explosionSound;

    // Use this for initialization
    void Start () {
        myTransform = this.transform;
    }

    // Update is called once per frame
    void Update () {
    }

    public override void takeDamage(float dmg){
        health -= dmg;

        if (health <= 0){
            Instantiate(barrelExplosion, myTransform.position, myTransform.rotation);
            Instantiate(explosionSound, myTransform.position, myTransform.rotation);
            Instantiate(explosionDamage, myTransform.position, myTransform.rotation);
            Destroy(this.gameObject);
        }
    }
}


造成损害的类别

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ExplosionAOE : MonoBehaviour {

    public float damage = 100.0f;

    public float lifeTime = 0.05f;
    private float lifeTimeDuration;

    public List<GameObject> damageTargets = new List<GameObject>();

    public float radius = 15.0f;

    GameManager gameManager;

    void Start() {
        gameManager = GameObject.FindGameObjectWithTag("GameManager").GetComponent<GameManager>();

        //Destroy (this.gameObject, lifeTime);
        lifeTimeDuration = Time.time + lifeTime;

        transform.GetComponent<SphereCollider>().radius = radius;
    }


    void Update() {

        //Explosion finishes, damage targets and remove AOE field
        if (Time.time > lifeTimeDuration) {
            foreach (GameObject target in damageTargets) {
                if (target != null) {
                    //Calculate damage based on proximity to centre of explosion
                    float thisDamage = ((radius - Vector3.Distance(target.transform.position, transform.position)) / radius) * damage;
                    print(thisDamage);
                    target.GetComponent<Entity>().takeDamage(thisDamage);
                    //target.SendMessage("takeDamage", damage);   //<< This is not good code. Let's fix this!
                }
            }
            Destroy(this.gameObject);
        }
    }


    void OnTriggerEnter(Collider otherObject) {

        if (otherObject.gameObject.tag == "Enemy") {
            damageTargets.Add(otherObject.gameObject);
        }
        if (otherObject.gameObject.tag == "Player") {
            Vector3 jumpVector = (otherObject.transform.position - transform.position).normalized;
            jumpVector *= 25;
            otherObject.GetComponent<CharacterMotor>().SetVelocity(jumpVector);
        }
    }
}


抱歉,这有点冗长,所有内容均已正确标记,所以这不是问题,谢谢。

最佳答案

问题1

随处使用“ Debug.Log”

 void OnTriggerEnter(Collider otherObject) {
 Debug.Log("in trig");
 Debug.Log("otherObject.gameObject.tag is " + otherObject.gameObject.tag);

        if (otherObject.gameObject.tag == "Enemy") {
Debug.Log("a");
            damageTargets.Add(otherObject.gameObject);
        }
        if (otherObject.gameObject.tag == "Player") {
Debug.Log("b");
            Vector3 jumpVector = (otherObject.transform.position -
                transform.position).normalized;
            jumpVector *= 25;
            otherObject.GetComponent<CharacterMotor>().SetVelocity(jumpVector);
        }
    }


特别是在实体和敌人中。

通过使用Debug.Log进行跟踪,可以立即回答诸如此类的问题。



问题2

这是一个PITA,可获取触发器,刚体等之间的关系。

这很可能是一个问题。

http://docs.unity3d.com/Manual/CollidersOverview.html

进入烦人的“触发动作矩阵”,然后从那里开始工作。



问题3

通常,切勿在Unity中使用“标签”功能。 (他们只添加了标签来帮助“ hello world”教程。)

实际上,您随时随地使用图层:

c# - Unity3D-敌人未受到伤害-LMLPHP

(图层在射击游戏中尤其重要:每个类别都需要一个图层。)



问题4

显示的代码肯定看起来不错。这是一些示例代码,与您的技巧相同。

一个简单的示例,请注意OnTrigger中的分离代码(返回),您应该这样做)。

也,

使用范围

随时随地都在Unity中。 Quick tutorial

如果您真的想专业地工作,这是#1技巧。

public class Enemy:BaseFrite
    {
    public tk2dSpriteAnimator animMain;
    public string usualAnimName;

    [System.NonSerialized] public Enemies boss;

    [Header("For this particular enemy class...")]
    public float typeSpeedFactor;
    public int typeStrength;
    public int value;

    // could be changed at any time during existence of an item!

    [System.NonSerialized] public FourLimits offscreen; // must be set by our boss

    [System.NonSerialized] public int hitCount;         // that's ATOMIC through all integers
    [System.NonSerialized] public int strength;         // just as atomic!

    [System.NonSerialized] public float beginsOnRight;

    private bool inPlay;    // ie, not still in runup

    void Awake()
        {
        boss = Gp.enemies;
        }

..........

    protected virtual void Prepare()    // write it for this type of sprite
        {
        ChangeClipTo(bn);
        // so, for the most basic enemy, you just do that.
        // for other enemy, that will be custom (example, swap damage sprites, etc)
        }

    void OnTriggerEnter2D(Collider2D c)
        {
        // we can ONLY touch either Biff or a projectile. to wit: layerBiff, layerPeeps

        GameObject cgo = c.gameObject;

        if ( gameObject.layer != Grid.layerEnemies ) // if we are not enemy layer....
            {
            Debug.Log("SOME BIZARRE PROBLEM!!!");
            return;
            }

        if (cgo.layer == Grid.layerBiff)    // we ran in to Biff
            {
            Gp.billy.BiffBashed();
            // if I am an enemy, I DO NOT get hurt by biff smashing in to me.
            return;
            }

        if (cgo.layer == Grid.layerPeeps)   // we ran in to a Peep
            {
            Projectile p = c.GetComponent<Projectile>();
            if (p == null)
                {
                Debug.Log("WOE!!! " +cgo.name);
                return;
                }
            int damageNow = p.damage;
            Hit(damageNow);
            return;
            }

        Debug.Log("Weirded");
        }

    public void _stepHit()
        {
        if ( transform.position.x > beginsOnRight ) return;

        ++hitCount;
        --strength;
        ChangeAnimationsBasedOnHitCountIncrease();
        // derived classes write that one.

        if (strength==0)    // enemy done for!
            {
            Gp.coins.CreateCoinBunch(value, transform.position);
            FinalEffect();

            if ( Gp.superTest.on )
                {
                Gp.superTest.EnemyGottedInSuperTest(gameObject);
                boss.Done(this);
                return;
                }

            Grid.pops.GotEnemy(Gp.run.RunDistance);     // basically re meters/achvmts
            EnemyDestroyedTypeSpecificStatsEtc();       // basically re achvments
            Gp.run.runLevel.EnemyGotted();              // basically run/level stats

            boss.Done(this);                            // basically removes it
            }
        }

    protected virtual void EnemyDestroyedTypeSpecificStatsEtc()
        {
        // you would use this in derives, to mark/etc class specifics
        // most typically to alert achievements system if the enemy type needs to.
        }

    private void _bashSound()
        {
        if (Gp.biff.ExplodishWeapon)
            Grid.sfx.Play("Hit_Enemy_Explosive_A", "Hit_Enemy_Explosive_B");
        else
            Grid.sfx.Play("Hit_Enemy_Non_Explosive_A", "Hit_Enemy_Non_Explosive_B");
        }

    public void Hit(int n)  // note that hitCount is atomic - hence strength, too
        {
        for (int i=1; i<=n; ++i) _stepHit();

        if (strength > 0) // biff hit the enemy, but enemy is still going.
            _bashSound();
        }

    protected virtual void ChangeAnimationsBasedOnHitCountIncrease()
        {
        // you may prefer to look at either "strength" or "hitCount"
        }

    protected virtual void FinalEffect()
        {
        // so, for most derived it is this standard explosion...
        Gp.explosions.MakeExplosion("explosionC", transform.position);
        }

    public void Update()
        {
        if (!holdMovement) Movement();

        if (offscreen.Outside(transform))
            {
            if (inPlay)
                {
                boss.Done(this);
                return;
                }
            }
        else
            {
            inPlay = true;
            }
        }

    protected virtual void Movement()
        {
        transform.Translate( -Time.deltaTime * mpsNow * typeSpeedFactor, 0f, 0f, Space.Self );
        }
......



/*
(frite - flying sprite)
The very base for enemies, projectiles etc.
*/

using UnityEngine;
using System.Collections;

public class BaseFrite:MonoBehaviour
    {
    [System.NonSerialized] public float mpsNow;
    // must be set by the boss (of the derive) at creation of the derive instance!

    private bool _paused;
    public bool Paused
        {
        set {
            if (_paused == value) return;

            _paused = value;

            holdMovement = _paused==true;

            if (_paused) OnGamePause();
            else OnGameUnpause();
            }
        get { return _paused; }
        }

    protected bool holdMovement;

    protected virtual void OnGamePause()
        {
        }
    protected virtual void OnGameUnpause()
        {
        }

    protected string bn;
    public void SetClipName(string clipBaseName)
        {
        bn = clipBaseName;
        }

    }

关于c# - Unity3D-敌人未受到伤害,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38012453/

10-17 02:01