我遵循了YouTube上的一个教程(可在link上找到)来演示如何在游戏中拖放项目。有没有人知道当所有磁贴都放置在可用插槽中后,如何修改代码以自动结束游戏或更改场景?我还想知道是否有任何方法可以限制用户将磁贴拖放到已经有磁贴的插槽上? 这是我已经拥有的所有源代码:
插槽源代码
public class Slot : MonoBehaviour, IDropHandler {
public GameObject item {
get {
if(transform.childCount>0){
return transform.GetChild (0).gameObject;
}
return null;
}
}
#region IDropHandler implementation
public void OnDrop (PointerEventData eventData)
{
if(!item){
DragHandeler.itemBeingDragged.transform.SetParent (transform);
ExecuteEvents.ExecuteHierarchy<IHasChanged>(gameObject,null,(x,y) => x.HasChanged ());
}
}
DragHandler源代码:
public void OnBeginDrag (PointerEventData eventData)
{
itemBeingDragged = gameObject;
startPosition = transform.position;
startParent = transform.parent;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
#endregion
#region IDragHandler implementation
public void OnDrag (PointerEventData eventData)
{
transform.position = eventData.position;
}
#endregion
#region IEndDragHandler implementation
public void OnEndDrag (PointerEventData eventData)
{
itemBeingDragged = null;
GetComponent<CanvasGroup>().blocksRaycasts = true;
if(transform.parent == startParent){
transform.position = startPosition;
}
}
答案 0 :(得分:2)
要更改场景,您需要使用以下内容:
SceneManager.LoadScene(scenename);
如果您还需要帮助您将逻辑放在项目中的逻辑位置-请添加您的代码以及关于您正在做的事情的更多说明,而不是链接到一些教程的22分钟。
更新:
这里是所有插槽都已满时更改场景的方法:
public void OnDrop (PointerEventData eventData)
{
if(!item)
{
DragHandeler.itemBeingDragged.transform.SetParent (transform);
ExecuteEvents.ExecuteHierarchy<IHasChanged>(gameObject,null,(x,y) => x.HasChanged ());
// This code will check if all slots are full and load new scene if they are
// If you already have an array/list of all your slots, you can replace this "FindObjectsOfType" with it
Slot[] allSlots = FindObjectsOfType<Slot>();
bool areAllBackpackSlotsFull = true;
foreach (Slot slot in allSlots)
{
if (slot.isBackpack == true && slot.item == null)
{
areAllBackpackSlotsFull = false;
break;
}
}
if (areAllBackpackSlotsFull)
{
string nextSceneName = "YourScene"; // Place the name of scene you want to load next
UnityEngine.SceneManagement.SceneManager.LoadScene(nextSceneName);
}
}
}
您还问过:
我还想知道是否有任何方法可以限制用户 将瓷砖放到已经有瓷砖的插槽上?
但是我看到它似乎已经在您的代码中实现了。在Slot的“ OnDrop”功能中检查当前项是否为null,这应该完全按照您的要求进行-仅在slot为空时放置磁贴。因此,它已经受到限制。您确定不是吗?
更新2:
更新有关背包和库存的新问题。您只需在Slot类中添加一些bool变量即可将背包与广告资源区分开来
public class Slot : MonoBehaviour, IDropHandler
{
public bool isBackpack = false;
...
然后在所有背包的编辑器中标记“ isBackpack”变量为true。这将是区分它们的简单便捷的方法。
我还更新了上面的代码(检查背包是否装满),因此现在只检查背包插槽。
更新3:
我注意到您在评论中又问了一个问题:
将图块从清单中拖出并放到“背包”中后,是否有办法将其锁定?即他们无法再次移动它?
这显然与原始帖子和问题无关,但是好吧,我也会尝试与此相关的问题...
我认为这样可以实现您想要的(我已经更改了DragHandler代码):
public void OnBeginDrag (PointerEventData eventData)
{
Slot currentSlot = gameObject.GetComponentInParent<Slot>();
if (currentSlot.isBackpack == false)
{
itemBeingDragged = gameObject;
startPosition = transform.position;
startParent = transform.parent;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
else
{
itemBeingDragged = null;
}
}
#endregion
#region IDragHandler implementation
public void OnDrag (PointerEventData eventData)
{
if (itemBeingDragged != null)
transform.position = eventData.position;
}
#endregion
#region IEndDragHandler implementation
public void OnEndDrag (PointerEventData eventData)
{
if (itemBeingDragged != null)
{
itemBeingDragged = null;
GetComponent<CanvasGroup>().blocksRaycasts = true;
if(transform.parent == startParent)
transform.position = startPosition;
}
}
希望有帮助。
PS 。我已经为您解决了5个不同的问题。请,如果您还有其他与原始帖子无关的问题,我建议您接受答案以解决此问题,并在其他帖子中使用新的更新代码和信息询问其他问题(您可以在此添加链接)在新帖子(问题)中发布)。因为这不是使用该网站的正确方法,而是要在评论中提出新的不相关的问题并不断更新问题和答案,所以这很不方便。