【问题标题】:Melee system in UnityUnity中的近战系统
【发布时间】:2020-09-03 03:02:57
【问题描述】:

我是统一和编程的新手。我试图让我在第一场比赛中团结一致。你能帮助我吗?我尝试了这个人 https://www.youtube.com/watch?v=TWQlNztOoSM 的教程,但我在他的脚本中遇到了很多错误。

【问题讨论】:

标签: c# visual-studio unity3d scripting


【解决方案1】:

我的一个项目中有一个类似的设置。

玩家:

设置玩家的攻击动画,在开始时调用 Attack,在结束时调用 StopAttack 见https://docs.unity3d.com/Manual/script-AnimationWindowEvent.html

假设 rightHand 是武器的父变换,你可以激活你的武器。将这些方法添加到播放器的脚本中:

    public void Attack()
    {
        foreach (Weapon w in rightHand.GetComponentsInChildren<Weapon>())
        {
            w.Attack();
        }
    }
    //called by animations
    public void StopAttack()
    {
        foreach (Weapon w in rightHand.GetComponentsInChildren<Weapon>())
        {
            w.StopAttack();
        }
    }

武器:添加一个对撞机并勾选“Is Trigger”

我的敌人都有一个名为“badguy”的类,可以使用 badguy.Damage(float amount) 受到伤害。 “掩码”用于优化,应设置为敌人的图层。如果您不确定,请将 mask 设置为所有内容。

public class Weapon : MonoBehaviour
...
{
    public LayerMask mask
    public float dmg;
    private bool canDmg;
    public float attackDuriation;
    private float timeSinceAttack;

    void Update()
    {
        timeSinceAttack += Time.deltaTime;
        if(timeSinceAttack > attackDuriation)
        {
            canDmg = false;
        }
    }

    public void Attack()
    {
        canDmg = true;
        timeSinceAttack = 0;
    }

    public void StopAttack()
    {
        canDmg = false;
    }

    void OnTriggerEnter(Collider other)
    {
        if (canDmg)
        {
            if(mask == (mask | (1 << other.gameObject.layer)))//if included in the mask
            {
                badguy bg = other.GetComponentInParent<badguy>();
                if(bg != null)
                {
                    bg.Damage(dmg);
                    canDmg = false;
                }
            }
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多