关于unity3d:敌对逻辑错误

 2020-11-22 

Enemy logic errors

我正在学习在Unity中制作游戏的教程,而我的JavaScript / UnityScript遇到了一个特殊的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma strict

var Health = 100;

function ApplyDamage (TheDamage : int)
{
    Health -= TheDamage;

    if(Health <= 0)
    {
        Dead();
   }
}

function Dead()
{
    Destroy (gameObject);
}

那是我的敌人游戏对象脚本,但是,尽管我有一个混战系统的逻辑,您必须单击两次他并死,否则它不起作用,而且只要我的玩家角色走进敌人,它就会自动销毁 没有点击。

我也会在这里发布我的近战系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma strict

var TheDamage : int = 50;
var Distance : float;
var MaxDistance : float = 1.5;

function Update ()
{
     if (Input.GetButtonDown("Fire1"))

         var hit : RaycastHit;
         if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit))
         {
             Distance = hit.distance;
             if (Distance < MaxDistance)
             (
                  hit.transform.SendMessage("ApplyDamage", TheDamage, SendMessageOptions. DontRequireReceiver)    
             );

   }
}

谁能帮我这个? 似乎是一个随机错误。


您的代码有问题。 您实际上并没有正确使用if语句。 这是因为您没有使用{}。 我将在下面发布如何解释您的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
 if (Input.GetButtonDown("Fire1"))
 {
    var hit : RaycastHit;
 }

 if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit))
 {
     Distance = hit.distance;
     if (Distance < MaxDistance)
     {
        hit.transform.SendMessage("ApplyDamage", TheDamage, SendMessageOptions. DontRequireReceiver);    
     }                
 }

显然,这不是您想要的。 请记住,如果不放在方括号中,则仅在if之后的行会在满足if条件时执行,其余部分将独立于if地执行。

1
2
3
4
5
6
7
8
9
10
11
12
if (Input.GetButtonDown("Fire1"))
{
    var hit : RaycastHit;
    if (Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit))
    {
        Distance = hit.distance;

        // Intentionally left the brackets out of this if to show you.
        if(Distance < MaxDistance)
           hit.transform.SendMessage("ApplyDamage", TheDamage, SendMessageOptions. DontRequireReceiver);    
    }
}

因此,我特意在if内的括号中省略了括号,以向您展示如何在没有括号的情况下使用它。 如果不确定,只需添加方括号,它将使您的代码更简洁,更易于理解,并且可以避免错误。


您为近战系统发布的代码的第一个if语句缺少大括号{},导致仅在单击鼠标时才执行var hit : RaycastHit;,并在每次调用Update时执行其余部分。