8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

go run 无法在用户模式下提供网站服务,但在 ubuntu WSL 中的 root 模式下可以运行 - Windows

Eric Camescasse 2月前

69 0

我正在制作一个拖放系统,其中每次单击都会从堆栈中将 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;
                    }
                }
            }
        }
    }
}
帖子版权声明 1、本帖标题:go run 无法在用户模式下提供网站服务,但在 ubuntu WSL 中的 root 模式下可以运行 - Windows
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Eric Camescasse在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我正在用 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 命令在根模式和用户模式下都可以正常工作。
    • 它只是 http 服务,它无法做到,我尝试了这个(不完全是我的问题,实际上相反,但尝试过: https://forum.golangbridge.org/t/go-doesnt-work-in-root-mode/27340/3 )
    • 我的猜测是,考虑到它是在 root 模式下工作,它可能缺少一些权限?我是 wsl 环境的新手,所以我认为这可能与此有关。

    预期的

    • 期望在正常模式下获得与根模式相同的结果。
  • 我认为这是 Linux 的设计,如果您不是 root 身份,则需要使用端口 1024 或更高。

  • @DrainBamage 始终检查函数返回的错误,特别是当函数不能按预期工作时。

  • 正如 @MikeChristensen 所建议的,没有 root 权限就不能使用低于 1024 的端口。(我找到的更多信息 - 帖子 )

    解决方案?

    • 除非真的需要开放低于1024的端口,否则你可以阅读上面的帖子,其中有一些建议。
    • 否则,您可以将端口更改为更高的值,如下所示:
    log.Fatal(http.ListenAndServe(":8080", nil))
    
  • 该方法应该在检查器每次发生更改时调用。当脚本发生更改并因此重新加载时,该方法可以完美运行:位置被捕捉并且控制台做出反应。好...

    该方法应该在检查器每次发生更改时调用。当脚本发生更改并因此重新加载时,该方法可以完美运行:位置被捕捉并且控制台做出反应。但是,该方法会忽略检查器中的任何进一步更改,例如拖动具有脚本的游戏对象或手动更改值。要使其对更改做出反应,可能缺少什么?

    public void OnValidate()
    {
        UpdateCellPosition();
        Debug.Log("works");
    }
    
  • 来自 Unity 脚本 API :

    当脚本加载或 Inspector 中的值发生变化时,Unity 调用的仅限编辑器的函数。

    OnValidate 仅对 脚本本身的变化做出反应,而不会对其他组件的变化做出反应(例如 Transform 在您的“移动对象”示例中)。

    目前没有针对发生在您自己的脚本之外的更改的回调。您可以使用(如果您每帧都执行复杂的操作,速度会很慢!)来临时实现 [ExecuteAlways] 在场景保存之前手动 EditorSceneManager.sceneSaving 运行的 OnValidate() 事件

  • 我正在使用任务后台处理程序,并在命令行中设置了标志,以便能够通过它添加输入。有没有办法让后台处理程序忽略这一点,因为目前我遇到一个未知的问题

    我正在使用任务后台处理程序,并在命令行中设置了标志,以便能够通过它添加输入。有没有办法让后台处理程序忽略这一点,因为目前我遇到一个问题,即它是后台处理程序的一个未知选项。

    例如:ts python -m upload_file -f file_to_upload.txt

    -f 给出了一个错误,它是一个未知的选项,但我用它来让 python 知道我正在上传哪个文件

  • 谢谢回答。不是有[ExecuteInEditMode]选项吗?我之前试过这个,结合Update()方法。但是顺便说一句,就像[ExecuteAlways]一样,根本没有效果。我可能缺少一些设置。但我稍后可以尝试使用EditorSceneManager。

  • Pycm 2月前 0 只看Ta
    引用 10

    您可能还必须将游戏对象标记为脏,以便 Unity 知道存在修改:EditorUtility.SetDirty(gameObject);。是否没有效果,因为它没有保存,或者根本没有调用 Update?(如果您在 Update 中执行了 Debug.Log,它会打印吗?)

  • DST 2月前 0 只看Ta
    引用 11

    此外,[ExecuteAlways] 是 [ExecuteInEditMode] 的重命名(处理了预制模式的边缘情况......)

  • 至于 Update() 之前的 [ExecuteInEditMode]:Debug.Log 和捕捉均不起作用。

  • 我想根据下图创建一个虚拟机场布局:在此处输入图片说明。稍后使用该地图的目的是引入不同的航班(代理)并使用寻路

    我想根据下图创建一个虚拟机场布局: 在此处输入图片描述 .

    稍后使用地图的目的是为了引入不同的航班(代理),并使用寻路算法让代理根据给定的某些条件遍历地图。

    我尝试使用 Pygame 定义矩形和碰撞来定义地图,但这似乎是一个繁琐的过程。有没有更好的方法来生成这样的地图?Unity Engine 怎么样?

  • 制作这样的地图有很多不那么繁琐的方法。是的,Unity Engine 可能是一个不错的选择,但这取决于你决定哪种引擎最适合你想要实现的目标。根据这些有限的信息,我只能建议你对游戏引擎/框架进行一些研究,尝试判断它们是否合适。否则这是一个非常开放的问题。

  • 我使用的代码是在 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
    
  • 我一直想用 snap 安装 pycham,但似乎不起作用。[sudo] 用户密码:错误:未找到 snap \'pycharm-professional\' 知道可能出了什么问题吗?我试过

    我一直尝试使用 snap 安装 pycham 但似乎不起作用。

    [sudo] password for user: 
    error: snap "pycharm-professional" not found
    

    知道可能哪里出了问题吗?

    我确实尝试重新安装 snap,但是没有成功,即使全新安装 Ubuntu 似乎也无济于事!

  • artm 2月前 0 只看Ta
    引用 17

    我对 Linux 了解不多,但这是我的意见:当提问时,请告诉我们您使用了什么命令,以便我们能够帮助解决问题。

    我确实为您查找了这个问题,如果您不想使用 snap,您可以正常安装它:

    来自链接的答案:

    首先你必须添加下面提到的存储库

    sudo add-apt-repository ppa:mystic-mirage/pycharm
    

    然后使用这些命令

    sudo apt-get update
    
    sudo apt-get install pycharm
    

    我得到答案的链接:https://askubuntu.com/questions/1025090/trying-to-install-pycharm-with-snap-gives-error-error-snap-pycharm-community

  • 正在使用此命令 sudo snap install pycharm-professional --channel=2021.3/stable --classic

  • 最好编辑原始问题以包含失败的命令行,而不是仅仅针对其中一个答案发布失败的命令行。Eranda 建议的命令是否允许您成功安装?

返回
作者最近主题: