我正在制作一个拖放系统,其中每次单击都会从堆栈中将 1 个项目放到鼠标上,但它会占用堆栈并留下 1 个项目,而不是相反。项目行为屏幕...
我正在制作一个拖放系统,每次单击都会从堆栈中取出 1 个项目到鼠标上,但它会占用堆栈并留下 1 个项目,而不是相反
物品行为脚本使物品跟随鼠标光标。库存管理器脚本从库存槽中添加和移除物品,并允许堆叠
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using TMPro;
public class ItemBehaviour : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
[Header("UI")]
[SerializeField]
private Image image;
public TMP_Text countText;
[HideInInspector]
public Items item;
[HideInInspector]
public int count = 1;
[HideInInspector]
public Transform parentAfterDrag;
private ItemBehaviour clone;
private void Start()
{
InitialiseItem(item);
}
public void RefreshCount()
{
if (count > 1)
{
countText.text = count.ToString();
}
else
{
countText.text = "";
}
}
public void InitialiseItem(Items newItem)
{
item = newItem;
image.sprite = newItem.sprite;
RefreshCount();
}
public void OnBeginDrag(PointerEventData eventData)
{
bool isShiftPressed = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
if (!isShiftPressed)
{
// Drag only one item
if (count > 1)
{
// Create a clone of the item
clone = Instantiate(this, transform.parent);
clone.count = 1;
clone.InitialiseItem(item);
clone.RefreshCount();
// Update the count of the original item
count--;
RefreshCount();
}
}
else
{
// Drag the whole stack
clone = this;
}
// Update UI
image.raycastTarget = false;
parentAfterDrag = transform.parent;
transform.SetParent(transform.root);
RefreshCount();
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
image.raycastTarget = true;
transform.SetParent(parentAfterDrag);
// Handle dropping the item
if (clone != this)
{
// If dragging a clone (one item), the original stack is left with updated count
if (count <= 0)
{
Destroy(gameObject);
}
}
else
{
// Otherwise, the item is left behind with updated count
RefreshCount();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InventoryManager : MonoBehaviour
{
public InventorySlot[] inventorySlots;
public GameObject inventoryItemPrefab;
[SerializeField]
private int maxitems;
[SerializeField]
private int currentItems;
private void Update()
{
UpdateCurrentItems();
}
public bool AddItem(Items item)
{
if (currentItems < maxitems)
{
// Check if the item can be stacked in an existing slot
for (int i = 0; i < inventorySlots.Length; i++)
{
InventorySlot slot = inventorySlots[i];
ItemBehaviour itemInSlot = slot.GetComponentInChildren<ItemBehaviour>();
if (itemInSlot != null && itemInSlot.item == item && itemInSlot.item.stackable == true)
{
itemInSlot.count++;
itemInSlot.RefreshCount();
currentItems++;
return true;
}
}
// Check for an empty slot to place the new item
for (int i = 0; i < inventorySlots.Length; i++)
{
InventorySlot slot = inventorySlots[i];
ItemBehaviour itemInSlot = slot.GetComponentInChildren<ItemBehaviour>();
if (itemInSlot == null)
{
SpawnItem(item, slot);
currentItems++;
return true;
}
}
return false;
}
else
{
Debug.Log("Storage is full");
return false;
}
}
// Spawns item in inventory
void SpawnItem(Items item, InventorySlot slot)
{
GameObject newItemGO = Instantiate(inventoryItemPrefab, slot.transform);
ItemBehaviour itemBehaviour = newItemGO.GetComponent<ItemBehaviour>();
itemBehaviour.InitialiseItem(item);
}
void UpdateCurrentItems()
{
currentItems = 0;
foreach (InventorySlot slot in inventorySlots)
{
ItemBehaviour[] itemsInSlot = slot.GetComponentsInChildren<ItemBehaviour>();
foreach (ItemBehaviour item in itemsInSlot)
{
currentItems += item.count;
}
}
}
// Check if the inventory has the specified item and quantity
public bool HasItem(Items item, int quantity)
{
foreach (InventorySlot slot in inventorySlots)
{
ItemBehaviour itemInSlot = slot.GetComponentInChildren<ItemBehaviour>();
if (itemInSlot != null && itemInSlot.item == item && itemInSlot.count >= quantity)
{
return true;
}
}
return false;
}
// Remove the specified quantity of an item from the inventory
public void RemoveItem(Items item, int quantity)
{
foreach (InventorySlot slot in inventorySlots)
{
ItemBehaviour itemInSlot = slot.GetComponentInChildren<ItemBehaviour>();
if (itemInSlot != null && itemInSlot.item == item)
{
if (itemInSlot.count > quantity)
{
itemInSlot.count -= quantity;
itemInSlot.RefreshCount();
return;
}
else
{
quantity -= itemInSlot.count;
Destroy(itemInSlot.gameObject);
if (quantity <= 0)
{
return;
}
}
}
}
}
}
我正在用 golang 编写一个简单的 Web 应用程序:golang http main.go 服务器,使用 vscode 用户模式调用服务器代码片段:package mainimport ( \'fmt\' \'net/http\')func
我正在用 golang 编写一个简单的 web 应用程序: golang http main.go 服务器,使用 vscode 用户模式调用
服务器代码片段:
package main
import (
"fmt"
"net/http"
)
func helloWorldPage(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w, "Hello world!")
}
func main(){
http.HandleFunc("/", helloWorldPage)
http.ListenAndServe("", nil)
}
问题是通过 vscode(或就此而言的简单用户模式)从终端进行的调用立即终止,而没有在默认端口 80 提供服务。
drainbamage@LAPTOP-KPETF9CD:~/dev/portfolio$ go version
go version go1.22.3 linux/amd64
drainbamage@LAPTOP-KPETF9CD:~/dev/portfolio$ go run main.go <--- terminates without hosting.
drainbamage@LAPTOP-KPETF9CD:~/dev/portfolio$
但是...如果我在根模式下运行相同的命令,它会按预期工作:
drainbamage@LAPTOP-KPETF9CD:~/dev/portfolio$ sudo su
[sudo] password for drainbamage:
root@LAPTOP-KPETF9CD:/home/drainbamage/dev/portfolio# go run main.go <--- working as expected.
^Csignal: interrupt
root@LAPTOP-KPETF9CD:/home/drainbamage/dev/portfolio#
根模式 main.go 调用
vscode 提示
托管网页
尝试过
go version
命令在根模式和用户模式下都可以正常工作。
预期的