脚本在c# Unity中不能正常工作

本文关键字:常工作 工作 不能 Unity 脚本 | 更新日期: 2023-09-27 18:02:03

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

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

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

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

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

)

My Code (Attack):

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;
    }
}
}

My Code (Run)

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# Unity中不能正常工作

我认为您应该考虑使用状态机来管理您的字符位置。事实上,它是状态机有用性的一个经典例子。《游戏编程模式》一书中有一个很棒的章节;实际上,这里使用的示例非常接近您正在处理的代码。

在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