我正在使用Unity3D开发游戏。
我有一个动画,当一个精灵被触摸时播放然后精灵被破坏。
当用户触摸精灵时,触发动画,同样当鼠标光标触摸精灵时,触发动画。
动画在触摸时会播放2-3次。当它被鼠标“触摸”时,它按预期工作 - 动画播放一次,精灵被破坏。
我正在使用协程来实现这一点。这是我第一次使用协程,所以我怀疑我使用不正确。
所以这是代码:
private void CheckForTouch()
{
foreach (Touch item in Input.touches)
{
Vector3 touchPosition =
Camera.main.ScreenToWorldPoint(item.position);
if (collider2D == Physics2D.OverlapPoint(touchPosition))
{
StartCoroutine(PlayAnimation());
break; //Put this in to stop any subsequent touches triggering?
}
}
//Mouse code - this works fine, which is what's confusing me.
Vector3 touchPositionKeyboard = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (collider2D == Physics2D.OverlapPoint(touchPositionKeyboard))
{
StartCoroutine(PlayAnimation());
}
}
private IEnumerator PlayAnimation()
{
//Setting this to true triggers the animation to be played
animController.SetBool("Dead", true);
yield return new WaitForSeconds(touchEvent.length);
//This destroys the object
TakeDamage(this.Health);
//Finally this sets it back to it's idle state
animController.SetBool("Dead", false);
}
这是在更新方法中调用的所有内容
void Update() { CheckForTouch(); }
我玩了一个bool触发器,在第一次调用PlayAnimation后切换它,但无济于事。
让我感到困惑的是,它适用于鼠标,但不适用于触摸,这让我觉得它不是协程。因为它的存在我很丢失。
任何帮助都将不胜感激。
提前致谢
答案 0 :(得分:0)
我建议您使用预处理程序指令
包围特定于平台的代码#if UNITY_STANDALONE
// mouse logic
#else
// touch logic
#endif
测试是否解决问题。
你也可以:
检查相应的Touch.phase
值以防止多次火灾。
而不是Animator.SetBool
考虑使用Animator.SetTrigger
- 您应该在Animator View
中正确配置它。
在Animation View
中,您可以添加要在帧中触发的事件。在最后一帧中添加一个将破坏对象的一个。这是我经常采用的方法。
答案 1 :(得分:0)
触摸经历了多个阶段,您可以为每个阶段启动协程。
触摸首先处于TouchPhase.Began
阶段,然后处于TouchPhase.Stationary
阶段,然后进入TouchPhase.Ended
阶段。您的CheckForTouch()
函数会针对这些多个状态获得相同的触摸。相反,您可以简单地向该函数添加一个if来对其进行排序:
foreach (Touch item in Input.touches)
{
if (item.phase == TouchPhase.Began)
{
Vector3 touchPosition = ...