【问题标题】:C# Unity script for item pick up choice用于物品拾取选择的 C# Unity 脚本
【发布时间】:2018-10-22 12:01:24
【问题描述】:

我目前有一个将 2 个预制件实例化为游戏对象的脚本。其中附加了一个脚本,将 game-object 设置为 false,然后将其添加到我的 inventory 数组中。这是另一个脚本,但我的问题是另一个未被选中的游戏对象仍然存在。应该是您可以选择2。一旦您选择了一个,另一个就会消失。我不知道该怎么做,谁能帮忙。

public int moralityCounter=0;
public bool Inventory;

public void Store()
{
    if (gameObject.CompareTag("Good"))
    {
        moralityCounter++;
        Debug.Log(moralityCounter);
        gameObject.SetActive(false);
    }
    if (gameObject.CompareTag("Bad"))
    {
        moralityCounter--;
        Debug.Log(moralityCounter);
        gameObject.SetActive(false);
    }

}

【问题讨论】:

  • the other game object that wasn't selected 这是什么意思?你能告诉我们你的代码吗?我真的不明白你到底想实现什么
  • 在另一个上也将 active 设置为 false
  • gyazo.com/699230cd435a48b0963cb8c4771c1ffc 所以当我拿走青苹果时,黄苹果也应该消失
  • 苹果的位置是什么?
  • 黄苹果是 X:-13.86 Y:5.36 Z:-0.3812452 绿苹果是 X:12.79 Y:5.16 Z:-03812452 这是生成点的图片:gyazo.com/d6f4849b6827c948c82cd18b33535f9f 还有,我确保 hitboxes 不会碰撞

标签: c# unity3d gameobject


【解决方案1】:

如果只有单个 good 和单个 bad 标记对象,您可以将所有标记为好和坏的对象设置为不活动。

private void DeactivateAllGoodBads() 
{
    // Deactivate all goods
    GameObject[] goodObjects = GameObject.FindGameObjectsWithTag("Good");
    foreach (GameObject goodObject in goodObjects)
    {
        goodObject.SetActive(false);
    }

    // Deactivate all bads
    GameObject[] badObjects = GameObject.FindGameObjectsWithTag("Bad");
    foreach (GameObject badObject in badObjects)
    {
        badObject.SetActive(false);
    }
}

public void Store()
{
    bool isGood = gameObject.CompareTag("Good");
    bool isBad = gameObject.CompareTag("Bad");
    if (isGood)
    {
        moralityCounter++;
        Debug.Log(moralityCounter);
    }

    if (isBad)
    {
        moralityCounter--;
        Debug.Log(moralityCounter);
    }

    if (isGood || isBad)
    {
        DeactivateAllGoodBads();
    }  
}

如果有多个,您可以执行一些操作,例如仅禁用距离存储对象比某个距离更近的对象。

private void DeactivateCloseGoodBads(Vector3 position, float maxDistance)
{
    // Deactivate close goods
    GameObject[] goodObjects = GameObject.FindGameObjectsWithTag("Good");
    foreach (GameObject goodObject in goodObjects)
    {
        // Check distance of found good
        if (Vector3.Distance(position, goodObject.transform.position) <= maxDistance) {
            goodObject.SetActive(false);
        }
    }

    // Deactivate close bads
    GameObject[] badObjects = GameObject.FindGameObjectsWithTag("Bad");
    foreach (GameObject badObject in badObjects)
    {
        // Check distance of found bad
        if (Vector3.Distance(position, badObject.transform.position) <= maxDistance) {
            badObject.SetActive(false);
        }
    }
}

public void Store()
{
    bool isGood = gameObject.CompareTag("Good");
    bool isBad = gameObject.CompareTag("Bad");
    if (isGood)
    {
        moralityCounter++;
        Debug.Log(moralityCounter);
    }

    if (isBad)
    {
        moralityCounter--;
        Debug.Log(moralityCounter);
    }

    if (isGood || isBad) 
    {
        DeactivateCloseGoodBads(gameObject.transform.position, 10f);
    }

}

【讨论】:

  • 我在统一 2D 中工作,第二个建议中的位置用红色下划线表示。 transform 不包含 location 的定义,并且找不到接受 Transform 的第一个参数类型的可访问扩展方法 location(您是否缺少指令或程序集引用)
  • 我认为他的意思是transform.position,没有像transform.location这样的东西来统一。试试 transform.position 并告诉我它是否有效。
  • 代码没有错误,但是我拿了第一个后第二个苹果没有消失。
  • 片田,是的,我的意思是 transform.position。谢谢。 @SIGMA 你把脚本放在这两个对象上吗?
  • 第二个,因为我将在一个场景中有多个好坏项目
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2019-06-07
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多