Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一2D&x27;攻击()';是一个局部函数,因此必须始终具有主体_C#_Function_Unity3d - Fatal编程技术网

C# 统一2D&x27;攻击()';是一个局部函数,因此必须始终具有主体

C# 统一2D&x27;攻击()';是一个局部函数,因此必须始终具有主体,c#,function,unity3d,C#,Function,Unity3d,我试图创建一个名为“Attack()”的函数,如果玩家在Unity 2D中面对不同的方向,它将以不同的方式出现,但我得到了上面提到的错误。我也得到这个错误“‘攻击’在当前上下文中不存在”。我对Unity相当陌生,所以请耐心等待。这是密码 `公共类玩家Combat:单一行为{ public Transform AttackAreaRight; public float AttackRangeRight = 0.5f; public float AttackRangeLeft = 0.5f; pub

我试图创建一个名为“Attack()”的函数,如果玩家在Unity 2D中面对不同的方向,它将以不同的方式出现,但我得到了上面提到的错误。我也得到这个错误“‘攻击’在当前上下文中不存在”。我对Unity相当陌生,所以请耐心等待。这是密码

`公共类玩家Combat:单一行为{

public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public bool IsFacingLeft = false;
public LayerMask EnemyLayers;
void Update()
{
    
   if (Input.GetKeyDown(KeyCode.A))
    {
        IsFacingRight = false;
        IsFacingLeft = true;
        Debug.Log("FacingLeft");
    }

    if (Input.GetKeyDown(KeyCode.D))
    {
        IsFacingLeft = false;
        IsFacingRight = true;
        Debug.Log("FacingRight");
    }
    if (Input.GetKeyDown(KeyCode.F))
    {
        Attack();
    }
    if (IsFacingRight = true) ;
    {
        void Attack()
        {
            Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackAreaRight.position, AttackRangeRight, EnemyLayers);
            foreach (Collider2D enemy in hitEnemies)
            {
                Debug.Log("LMAORight");
            }
        }
    }
    if (IsFacingLeft = true) ;
    {
        void Attack();
        {
            Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackAreaLeft.position, AttackRangeLeft, EnemyLayers);
            foreach (Collider2D enemy in hitEnemies)
            {
                Debug.Log("LMAOLeft");
            }
        }
    }
}
}
`所以这里有几个问题。这才是你想要的

public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public LayerMask EnemyLayers;
void Update()
{

    if (Input.GetKeyDown(KeyCode.A))
    {
        IsFacingRight = false;
        Debug.Log("FacingLeft");
    }

    if (Input.GetKeyDown(KeyCode.D))
    {
        IsFacingRight = false;
        Debug.Log("FacingRight");
    }
    if (Input.GetKeyDown(KeyCode.F))
    {
        Attack();
    }
}

void Attack()
{
    Vector2 attackPosition;
    float attackRange;
    if (IsFacingRight)
    {
        attackPosition = AttackAreaRight.position;
        attackRange = AttackRangeRight;
    }
    else 
    {
        attackPosition = AttackAreaLeft.position;
        attackRange = AttackRangeLeft;
    }
    Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPosition, attackRange, EnemyLayers);

    foreach (Collider2D enemy in hitEnemies)
    {
        Debug.Log("Attacked");
    }
}
第一个问题是在函数中声明了一个函数。Update()是一个每帧调用一次的统一函数,因此在它内部不能声明一个函数(这就是您使用void Attack()所做的)

现在,如果要为角色的方向(左/右)设置一个值,那么只需1个布尔值就更容易了,这样以后就不会出现类似IsLeft bieng true和IsRight true的错误。因为如果islight为true,那么IsLeft必须为false,依此类推


然后,您可以在攻击函数中检查此布尔值,并为重叠圆设置相应的数据。

我不确定它是否正常工作,但至少现在没有给出编译错误。 如果你能测试一下的话

using UnityEngine;
public class PlayerCombat : MonoBehaviour
{
public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public bool IsFacingLeft = false;
public LayerMask EnemyLayers;
void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
        IsFacingRight = false;
        IsFacingLeft = true;
        Debug.Log("FacingLeft");
    }

    if (Input.GetKeyDown(KeyCode.D))
    {
        IsFacingLeft = false;
        IsFacingRight = true;
        Debug.Log("FacingRight");
    }
    if (Input.GetKeyDown(KeyCode.F)){
        Attack();
    }
}
 private void Attack()
 {
        if (IsFacingLeft == true && IsFacingRight == false)
        {

            Collider2D[] hitEnemies = 
Physics2D.OverlapCircleAll(AttackAreaLeft.position, AttackRangeLeft, EnemyLayers);
            foreach (Collider2D enemy in hitEnemies)
                {
                Debug.Log("LMAOLeft");
                }
        }

        else if (IsFacingRight == true  && IsFacingLeft == false)
        {
            Collider2D[] hitEnemies = 
Physics2D.OverlapCircleAll(AttackAreaRight.position, AttackRangeRight, EnemyLayers);
            foreach (Collider2D enemy in hitEnemies)
                {
                Debug.Log("LMAORight");
                }
        }
    }
}

你在if语句中声明了“attack”(jn-fact 2),如果你按F,你希望攻击做什么?你可以在函数中声明函数,它们被称为局部函数,这是C#7的特性