我正在制作一个拖放系统,其中每次单击都会从堆栈中将 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;
}
}
}
}
}
}
我使用的代码是在 vscode 中编写的 python 代码。from pynput.keyboard import Key, Listenerdef on_press(key): try: print('key is pressed: {0}'.format(key.char)) except AttributeErr...
我使用的代码是用vscode编写的python代码。
from pynput.keyboard import Key, Listener
def on_press(key):
try:
print('key is pressed: {0}'.format(key.char))
except AttributeError:
print('anomaly key is pressed: {0}'.format(key))
def on_release(key):
print('key is released: {0}'.format(key))
if key == Key.esc:
return False
with Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
python版本是3.8.10,pynput版本是最新更新版本
ssh远程bash终端不响应键盘输入,但是如果我直接使用通过VNC连接的Ubuntu终端运行它,它会正常输出。
甚至在 ssh 中执行的 python 代码也不会响应来自 ssh 终端的输入,但会响应来自实际 Ubuntu 终端的输入。我不知道为什么会这样
我想让 vscode 的 ssh 终端正常输出结果。请帮帮我
直接使用 Ubuntu 终端
ssh 远程 bash 终端
这是我的 .bashrc 所有配置
alias sb="source ~/.bashrc; echo \"bashrc is reloaded.\""
alias domain="export ROS_DOMAIN_ID=13"
alias galactic="source /opt/ros/galactic/setup.bash; echo>
alias my_study="source /home/pi/ros2_study/install/local_>
source /opt/ros/galactic/setup.bash
echo "Ros2 galactic is activated."
export ROS_PATH=/opt/ros/galactic/bin
export DISPLAY=:0