【问题标题】:Scripts not working as they should in C# Unity脚本在 C# Unity 中无法正常工作
【发布时间】:2014-05-08 02:33:47
【问题描述】:

在使用 Unity 2d 脚本时遇到了一些问题。我有精灵工厂,目前有 2 个脚本。一个用来跑,一个用来攻击。我遇到的问题如下:

1) 我的角色在向右移动时运行良好。当他向左跑时,空闲动画总是设置在右侧。所以当他停止向左跑时,它会在他跑完后自动将角色移回正确的方向

2) 我有一个攻击脚本。该脚本在单独编写脚本时工作正常,即 Attack.cs。然而,当我也激活我的步行脚本时,攻击动画完全消失了。我需要将代码合并在一起吗?

3) 此外,我有 3 组攻击,我希望将其编程为字母 A。我的角色可以发起第一次攻击,但由于是 3 组攻击,用户需要按攻击 3发起 3 次攻击的次数。如果角色进行 2 次攻击,它应该重置为初始攻击。

任何关于如何精通 C# 的建议也将是有益的,因为我不擅长 Unity 编码 =(

我的代码(攻击):

using UnityEngine;
using System.Collections;
using FactorySprite = SpriteFactory.Sprite;
public class Attack : MonoBehaviour {

// you forgot to set name of variable representing your sprite
private FactorySprite sprite;

// Use this for initialization
void Start () {
    sprite = GetComponent<FactorySprite> (); // Edited
}
void Update () 
{
    if(Input.GetKeyDown(KeyCode.A)) 
    {
        sprite.Play("Attack");
        Vector3 pos = transform.position;
        pos.x += Time.deltaTime * 1;
        transform.position = pos;
    }
}
}

我的代码(运行)

using UnityEngine;
using System.Collections;
using FactorySprite = SpriteFactory.Sprite;
public class Walk : MonoBehaviour {

// you forgot to set name of variable representing your sprite
private FactorySprite sprite;

// Use this for initialization
void Start () {
    sprite = GetComponent<FactorySprite> (); // Edited
}

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


            if (Input.GetKey (KeyCode.RightArrow)) {
                    sprite.Play ("Walk"); // heh, remember C# is case sensitive :)
                    Vector3 pos = transform.position;
                    pos.x += Time.deltaTime * 6;
                    transform.position = pos;

            } else if (Input.GetKey (KeyCode.LeftArrow)) {
                    sprite.Play ("Walk0"); // heh, remember C# is case sensitive :)
                    Vector3 pos = transform.position;
                    pos.x += Time.deltaTime * -6;
                    transform.position = pos;




            } else {
                    sprite.Stop ();
            }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我认为你应该考虑使用状态机来管理你的角色位置。事实上,它是状态机有用性的一个经典例子。 《游戏编程模式》一书has a great chapter about it;事实上,那里使用的示例与您正在处理的代码非常接近。

    【讨论】:

      【解决方案2】:

      在 walk 脚本的更新函数中调用 sprite.stop() 将停止攻击动画。

      您可以检查活动动画是 Walk 还是 Walk0 以不停止其他动画。 http://docs.unity3d.com/Documentation/ScriptReference/Animation.IsPlaying.html

      解决方案可能是这样的(未经测试):

      Animation anim = gameObject.GetComponent<Animation>();
      if (anim.IsPlaying("Walk") || anim.IsPlaying("Walk0")) {
       sprite.Stop();
      }
      

      或者更确切地说,因为我从您的代码中可以看到您使用的是“Sprite Factory”:

      if (sprite.IsAnimationPlaying(1) || sprite.IsAnimationPlaying(2)) {
       sprite.Stop();
      }
      

      假设在这种情况下“Walk”的animationIndex为1,“Walk0”为2。 您可以在此处阅读有关 IsAnimationPlaying 的更多信息:http://www.guavaman.com/projects/spritefactory/docs/pages/classes/Sprite-IsAnimationPlaying.html

      【讨论】:

      • 您好,感谢您的回复。这实际上已经解决了这个问题。如果我从代码中删除“sprite.stop()”,攻击看起来很好,但是,角色连续循环运行,一旦我放开左键或右键就不会闲置#
      • 我很高兴它成功了,我添加了一个可能(但未经测试)的解决方案。
      • 这有点奏效。攻击动画有效,但现在跑动掉线了? ://
      • 你也可以检查 if (Input.GetKeyUp(KeyCode.RightArrow)) sprite.Stop();因此,当您释放该键时,它会停止播放任何动画。当然,还可以使用 leftArrow 以及您想要开始/停止动画的任何其他按键/释放来添加它。
      猜你喜欢
      • 2017-05-23
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多