【问题标题】:Scripting in unity 3d统一 3d 中的脚本
【发布时间】:2017-12-12 07:45:18
【问题描述】:

我在 Unity3D 中遇到问题。我有相同的健康脚本附加到玩家和敌人。我想在玩家死亡时显示游戏结束消息,但问题是玩家和敌人死亡时都会出现游戏结束消息。

我的代码是这样的:

public class CharacterStats : MonoBehaviour 
{
    // Use this for initialization
    void Start () 
    {
    }

    // Update is called once per frame
    void Update () 
    {
        health = Mathf.Clamp (health, 0, 100);
    }

    public void damage(float damage)
    {
        health -= damage;
        if(health<=0)
        {
            Die();
            Application.LoadLevel(gameover);
        }
    }

    void Die()
    {
        characterController.enabled = false;
        if (scriptstodisable.Length == 0)
            return;
                 foreach (MonoBehaviour scripts in scriptstodisable)

                scripts.enabled = false;
                 if (ragdollmanger != null)
                     ragdollmanger.Raggdoll();
    }
}

【问题讨论】:

  • 您可以添加一个描述角色类型(玩家或敌人)的枚举,并且仅当您的枚举值 == 玩家时才显示“死亡”消息

标签: c# unity3d monodevelop


【解决方案1】:

当您为玩家和敌人使用 1 个脚本时。您应该为这两个类设置不同的类并实现接口或从基类派生以实现健康:

public class Character : MonoBehaviour 
{
    public float Health;

    public virtual void Damage(float damageValue) 
    {
        Health -= damageValue;
    }

    public virtual void Die()
    {

    }
}

public Enemy : Character
{
    public override void Die()
    {
        // do enemy related stuff
    }
}

public Player : Character
{   
    public override void Die()
    {
        // do player related stuff.
        // like game over screen
    }
}

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    您可以使用 bool 来检查 CharacterStats 是否附加到玩家,例如通过将名为 ”Player” 的标签添加到玩家游戏对象并检查是否gameObject.tag == “Player”,或者您可以等效地命名游戏对象”Player” 并检查 gameObject.name 如果您愿意。

    只有当游戏对象是玩家(isPlayer 为真)时,您才能运行游戏结束消息的函数。

    public class CharacterStats : MonoBehaviour 
    {
        bool isPlayer = false;
    
        // Use this for initialization
        void Start () 
        {
            if(gameObject.tag == “Player”) 
            {
                isPlayer = true;
            }      
        }
    
        // Update is called once per frame
        void Update () 
        {
            health = Mathf.Clamp (health, 0, 100);
        }
    
        public void damage(float damage)
        {
            health -= damage;
            if(health<=0)
            {
                if(isPlayer)
                {
                    // Do Player-only stuff
                }
    
                // Do Stuff for both players and enemies
            }
        }
    }
    

    【讨论】:

    • 标签是一个字符串,应该像这样用双引号括起来:if(gameObject.tag == "Player").
    • 谢谢@padonald。是一个愚蠢的错字。 @yasirkhan 现在对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多