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