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