如何统一将一个对象的父级更改为另一个插槽父级?
how to change the parent of an object to another slot parent in unity?
我正在做一个剪刀石头布游戏,但不是众所周知的经典游戏,你有12张牌,每种类型3张蓝色牌(3张纸牌,3张石头牌,3张剪刀牌),2张紫色牌每种类型和最后一张同时包含纸和剪刀的卡片,要开始游戏,您必须将这些卡片排列在插槽中。
经过深思熟虑,我让它与拖放系统一起工作,但我遇到了一些问题:
- 第一个问题,每次我尝试将任何卡放入插槽时,它 return 都会回到原来的位置。
- 第二个问题,我希望插槽成为插入其中的卡的父级,但是当我开始拖动它时它只是离开它的父级然后当我释放它时它 returns 到它的原始父级(我什至试图删除我的脚本中的一些行来测试第二个问题是否是由第一个问题引起的,但即使认为卡在插槽中实现并且这些代码并非毫无意义它们也是一样的return 如果卡未在插槽中实现,则将卡移至其原始位置)。
这里的卡片代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragDrop : MonoBehaviour, IPointerDownHandler,IBeginDragHandler,IEndDragHandler,IDragHandler
{
private RectTransform rectTransform;
private CanvasGroup canvasGroup;
public Text textField;
[SerializeField] Canvas canvas;
private Transform originalPos;
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
}
public void OnBeginDrag(PointerEventData eventData)
{
canvasGroup.alpha = .5f;
canvasGroup.blocksRaycasts = false;
originalPos = transform.parent;
transform.SetParent(transform.parent.parent);
}
public void OnDrag(PointerEventData eventData)
{
rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
}
public void OnEndDrag(PointerEventData eventData)
{
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true;
transform.SetParent(originalPos);
transform.localPosition = Vector3.zero;
if (transform.localPosition == Vector3.zero)
{
textField.enabled = true;
}
}
public void OnPointerDown(PointerEventData eventData)
{
textField.enabled = false;
}
}
这里是广告位代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class slots : MonoBehaviour, IDropHandler
{
public GameObject slot;
public void OnDrop(PointerEventData eventData)
{
if(eventData.pointerDrag != null)
{
eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;
}
}
}
我真的很感激你能帮助我的任何事情,因为我已经被困在这个问题上 2 天了。
在我看来,您好像在 OnEndDrag 方法中将 Transform.parent 设置回 originalPos。您可能应该执行 MouseToWorldPoint 并找到您悬停的对象,然后将父级设置为该 gameObjects 转换。
我正在做一个剪刀石头布游戏,但不是众所周知的经典游戏,你有12张牌,每种类型3张蓝色牌(3张纸牌,3张石头牌,3张剪刀牌),2张紫色牌每种类型和最后一张同时包含纸和剪刀的卡片,要开始游戏,您必须将这些卡片排列在插槽中。
- 第一个问题,每次我尝试将任何卡放入插槽时,它 return 都会回到原来的位置。
- 第二个问题,我希望插槽成为插入其中的卡的父级,但是当我开始拖动它时它只是离开它的父级然后当我释放它时它 returns 到它的原始父级(我什至试图删除我的脚本中的一些行来测试第二个问题是否是由第一个问题引起的,但即使认为卡在插槽中实现并且这些代码并非毫无意义它们也是一样的return 如果卡未在插槽中实现,则将卡移至其原始位置)。 这里的卡片代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragDrop : MonoBehaviour, IPointerDownHandler,IBeginDragHandler,IEndDragHandler,IDragHandler
{
private RectTransform rectTransform;
private CanvasGroup canvasGroup;
public Text textField;
[SerializeField] Canvas canvas;
private Transform originalPos;
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
}
public void OnBeginDrag(PointerEventData eventData)
{
canvasGroup.alpha = .5f;
canvasGroup.blocksRaycasts = false;
originalPos = transform.parent;
transform.SetParent(transform.parent.parent);
}
public void OnDrag(PointerEventData eventData)
{
rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
}
public void OnEndDrag(PointerEventData eventData)
{
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true;
transform.SetParent(originalPos);
transform.localPosition = Vector3.zero;
if (transform.localPosition == Vector3.zero)
{
textField.enabled = true;
}
}
public void OnPointerDown(PointerEventData eventData)
{
textField.enabled = false;
}
}
这里是广告位代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class slots : MonoBehaviour, IDropHandler
{
public GameObject slot;
public void OnDrop(PointerEventData eventData)
{
if(eventData.pointerDrag != null)
{
eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;
}
}
}
我真的很感激你能帮助我的任何事情,因为我已经被困在这个问题上 2 天了。
在我看来,您好像在 OnEndDrag 方法中将 Transform.parent 设置回 originalPos。您可能应该执行 MouseToWorldPoint 并找到您悬停的对象,然后将父级设置为该 gameObjects 转换。