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

时间:2014-05-06 14:30:23

标签: c# unity3d

使用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 ();
            }
    }
}

2 个答案:

答案 0 :(得分:0)

我认为您应该考虑使用状态机来管理您的角色位置。实际上,它是状态机有用性的典型示例。这本书&#34;游戏编程模式&#34; has a great chapter about it;事实上,在那里使用的示例是非常接近您正在处理的代码。

答案 1 :(得分:0)

在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();
}

或者更确切地说,因为你正在使用&#34; Sprite Factory&#34;据我所知,从您的代码中可以看出:

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

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