我正在跟踪Unity中的Udemy 2D教程,以创建2D像素游戏。语言是C#。 在我的玩家脚本中,我具有攻击功能,例如,当我按Enter键时,剑就从玩家身上发出,并朝着玩家所看的方向前进(就像在旧的塞尔达游戏中一样)。为了使玩家在攻击时停滞一会儿,同时又限制了剑的射程,我使用了另一个名为Sword的脚本,问题是我认为根本没有调用该脚本(我尝试过甚至可以在无效的开始中进行一些调试,但是什么也没有。
以下是代码:
-这是我的攻击代码:
void attack()
{
canMove = false;
GameObject newSword = Instantiate(sword, transform.position, sword.transform.rotation);
#region //SwordRotation
int swordDir = anim.GetInteger("dir");
if (swordDir == 0)
{
newSword.transform.Rotate(0, 0, 0);
newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.up * thrustPower);
}
else if (swordDir == 1)
{
newSword.transform.Rotate(0, 0, 180);
newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.down * thrustPower);
}
else if (swordDir == 2)
{
newSword.transform.Rotate(0, 0, 90);
newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.left * thrustPower);
}
else if (swordDir == 3)
{
newSword.transform.Rotate(0, 0, -90);
newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.right * thrustPower);
}
#endregion
}
这是我的Sword代码:我主要是使用它的,因为在进行攻击时canMove设置为false,因此我必须在很短的时间后将其重置为true才能再次移动。
PS:我注意到的是,剑脚本是直接在scripts文件夹的unity界面中创建的,乍一看与任何游戏对象都不相关。
{
public float timer;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
GameObject.FindGameObjectWithTag("Player").GetComponent<Player>().canMove = true;
Destroy(gameObject);
}
}
}
答案 0 :(得分:0)
您的预制件在实例化时是否附加了脚本?如果没有,您仍然需要在其上添加AddComponent
看起来您没有给计时器提供值(浮动计时器;浮动计时器的整数= 10f;)。因此,当您实例化您的剑时,它将立即被销毁。也许这就是为什么您看不到它的原因?
关闭主题-我建议不要在Update()中这样做:
GameObject.FindGameObjectWithTag("Player").GetComponent<Player>().canMove = true;
,而是考虑给玩家一个单身人士,或者至少在Start()处获得一次引用。您正在搜索带有该标签的所有游戏对象,试图每秒发现游戏中每把剑的玩家60次,并获取组件。如果您有充分的理由这样做,请确认,如果没有,请考虑进行更改。如果您只是尝试并玩得开心,这并不是什么大问题,但也许在某些时候仍然需要考虑。