Unity3d Unity2D:播放实例化的预置';在拖动预制件时播放动画

Unity3d Unity2D:播放实例化的预置';在拖动预制件时播放动画,unity3d,instantiation,Unity3d,Instantiation,我有一个预置,当用户从我的游戏商店购买物品时,它被实例化,无论实例化多少,所有预置都有一个特定位置的起始位置。可以使用我在网上找到的TouchScript包在场景中拖动预制件!我的问题:我想在每次用户在屏幕上拖动预制件时播放预制件的动画,我尝试通过创建一个RaycastHit2D函数来检测用户是否单击了预制件的碰撞器,脚本如下: if (Input.GetMouseButtonDown (0)) { Vector2 worldPoint = Camera.main.Scr

我有一个预置,当用户从我的游戏商店购买物品时,它被实例化,无论实例化多少,所有预置都有一个特定位置的起始位置。可以使用我在网上找到的TouchScript包在场景中拖动预制件!我的问题:我想在每次用户在屏幕上拖动预制件时播放预制件的动画,我尝试通过创建一个RaycastHit2D函数来检测用户是否单击了预制件的碰撞器,脚本如下:

    if (Input.GetMouseButtonDown (0)) {
        Vector2 worldPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast (worldPoint, Vector2.zero);
        if (hit.collider != null) {
            if (this.gameObject.name == "Item5 (1)(Clone)" +item5Increase.i) {
                monkeyAnim.SetBool ("draging", true);
                Debug.Log (hit.collider.name);
            }
        } else {
            monkeyAnim.SetBool ("draging", false);
        }
    }

然而,如果我要购买多个预制件,当我开始只拖动其中一个预制件时,所有实例化的预制件都会播放动画,希望我讲得通。有人能帮我吗?谢谢大家!

我在2D游戏中遇到了类似的平台问题。我建议的解决方案是创建一个
GameObject
,作为您希望设置动画的当前项目,以及一个
LayerMask
,作为光线投射可以命中的对象的过滤器。您可以将此
LayerMask
与结合使用,它有一个重载方法,将
LayerMask
作为参数

首先创建一个新层,这可以通过转到场景中对象的右上角并访问“层”框来完成。一旦你创建了一个新的层(我称之为我的“项目”),确保你的预制层分配正确

然后,在场景中创建一个空对象,并将此脚本附加到该对象。在该对象上,您将看到一个下拉菜单,询问您的光线投射应该命中哪些层。将其指定为“项目”层;这确保了光线投射只能命中该层中的对象,因此单击游戏中的任何其他内容都不会产生任何效果

using UnityEngine;

public class ItemAnimation : MonoBehaviour
{
    private GameObject itemToAnimate;
    private Animator itemAnim;

    [SerializeField]
    private LayerMask itemMask;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            CheckItemAnimations();
        }

        else if (Input.GetMouseButtonUp(0) && itemToAnimate != null) //reset the GameObject once the user is no longer holding down the mouse
        {
            itemAnim.SetBool("draging", false);
            itemToAnimate = null;
        }
    }

    private void CheckItemAnimations()
    {
        Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero, 1, itemMask);

        if (hit) //if the raycast hit an object in the "item" layer
        {
            itemToAnimate = hit.collider.gameObject;

            itemAnim = itemToAnimate.GetComponent<Animator>();
            itemAnim.SetBool("draging", true);

            Debug.Log(itemToAnimate.name);
        }

        else //the raycast didn't make contact with an item
        {
            return;
        }
    }
}
使用UnityEngine;
公共类ItemAnimation:单行为
{
私有游戏对象项到动画;
私人动画师;
[序列化字段]
私有层掩码项掩码;
私有void更新()
{
if(Input.GetMouseButtonDown(0))
{
CheckItemAnimations();
}
else if(Input.GetMouseButtonUp(0)&&itemToAnimate!=null)//在用户不再按住鼠标时重置游戏对象
{
itemAnim.SetBool(“拖动”,假);
itemToAnimate=null;
}
}
私有void CheckItemAnimations()
{
Vector2 worldPoint=Camera.main.ScreenToWorldPoint(Input.mousePosition);
RaycastHit2D hit=Physics2D.Raycast(世界点,向量2.0,1,项掩码);
if(hit)//如果光线投射击中“item”层中的对象
{
itemToAnimate=hit.collider.gameObject;
itemAnim=itemToAnimate.GetComponent();
itemAnim.SetBool(“拖动”,真);
Log(itemToAnimate.name);
}
else//raycast未与项目联系
{
返回;
}
}
}

感谢您的回复,我尝试了您的建议,但仍有一些问题,例如,如果在游戏中的任何位置单击,我会得到空引用,这意味着else语句不起作用…当我拖动项目时,响应时间很慢,例如,它需要我在项目上单击两次并拖动它,以便播放动画并获得debug.log,告诉我项目的名称。再次感谢你的帮助,我真的很感激!:)我用一些新代码更新了我的答案,以修复空异常。关于动画速度慢,可能是您正在使用的触摸脚本有问题,或者您没有在动画窗口中删除动画延迟。Unity中的所有动画都是使用“退出时间”和“过渡持续时间”创建的,如果要立即设置动画,必须删除这两个选项。我确保删除了这些,然后在一个项目中测试了这个,一切都像预期的那样工作。谢谢你的回复,它工作了!!!谢谢,但是,我不认为动画是个问题,因为我没有打开“has exit time”,或者在动画中没有很长的“transition duration”。我可以是我正在使用的触摸脚本,但我不是高级程序员,哈哈!你知道我能做什么吗?再次感谢你的帮助!非常感谢你!不幸的是,我不知道您的项目的具体情况,但您最好尝试编写自己的拖放功能。有许多在线教程可用于此,与其他代码链接可能比尝试找出其他人编写的脚本更容易,因为该脚本的功能可能比您需要的多得多。我通常尽量避免使用Unity软件包和第三方代码,因为我发现它有时花费的时间比节省的时间多。