【问题标题】:Unity - Resizing one GameObject to match anotherUnity - 调整一个游戏对象的大小以匹配另一个
【发布时间】:2015-10-14 16:11:54
【问题描述】:

我正在 Unity 中开展一个项目,该项目涉及将任何非静态对象从一个传送到配对的区域。那部分很好,但为了方便起见,我正在尝试编写脚本的一部分,如果调整一个对象的大小,它将调整一个对象的大小,以便它们始终具有相同的大小。到目前为止,它的工作原理 - 主要是。我遇到的唯一问题是尝试通过 Transform 组件调整大小时 - 例如在 Inspector 中输入数字,或使用 X 或 Y 或 Z 上的值滑块。手柄工作正常。我想这没什么大不了的,但是如果我能弄清楚为什么这不起作用,那么我可以学习将来要做什么,我会很高兴。代码如下:

[ExecuteInEditMode]
public class TransferRegion : MonoBehaviour {
    // Unrelated code...

    public bool scaleManuallyAltered {
        get; private set;
    }

    [SerializeField]
    private TransferRegion pair;

    private Vector3 scale;

    // Called whenever the scene is edited
    void Update () {
        if (scale != gameObject.transform.localScale) {
            scaleManuallyAltered = true;
            scale = gameObject.transform.localScale;
        }
        if (pair && scaleManuallyAltered && !pair.scaleManuallyAltered) {
            pair.transform.localScale = scale;
        }
    }

    // Called AFTER every Update call
    void LateUpdate () {
        scaleManuallyAltered = false;
    }

    // Unrelated code...
}

如果有人能看到我正在犯的一些重大的逻辑错误,我想知道。如果我的代码有点难以理解,我也可以稍微解释一下我的逻辑流程,我知道我很容易做出一些令人困惑的结构。
谢谢各位。

【问题讨论】:

  • 你的代码做什么和不做什么?如果不通过Transform,您将如何扩展?
  • 该代码查看应用的对象是否已调整大小,如果已调整,则调整配对对象的大小。更准确地说,如果 GameObject 的当前比例与之前记录的比例不同;在这种情况下,它将其scaleManuallyAltered 标志设置为true,然后重置缩放变量,然后检查其他游戏对象是否也已调整大小;如果没有,它将对上的比例更改为当前比例。
  • 哦,对了。我正在查看的代码 几乎 有效。关键失败:它似乎不喜欢在一个对象或另一个对象的 Transform 组件中接受手动、输入数字的比例编辑。而且我不确定您所说的“不通过变换缩放”是什么意思——因为我认为我 是。
  • 那个问题是关于“我遇到的唯一问题是尝试通过 Transform 组件调整大小时。”这意味着在没有 Transform 组件的情况下调整大小时不会遇到问题。你的cmets已经澄清了,我认为你的帖子只是误导。编辑:那好多了,当我可以访问 Unity 环境时,我会更深入地了解。
  • 那里,我认为这可能更清楚。这可能只是我的一些愚蠢的失败,但它不起作用似乎很奇怪。

标签: c# unity3d unity3d-editor


【解决方案1】:

如果您希望一个对象与另一个对象具有相同的比例,为什么不直接通过将调整大小的游戏对象的比例设置为它所基于的游戏对象的比例来简化您的代码?例如,此脚本在编辑模式下调整对象的大小以匹配其对的比例:

using UnityEngine;
using UnityEditor;
using System.Collections;

[ExecuteInEditMode]
public class tester : MonoBehaviour
{
    public Transform PairedTransform;

    void Update()
    {
        if (!Selection.Contains(gameObject))
        {
            gameObject.transform.localScale = PairedTransform.localScale;
        }
    }
}

我在场景中的两个立方体上对此进行了测试。我可以使用 Gizmo 调整大小,也可以在检查器的转换编辑字段中手动输入数字。

编辑:通过利用Selection,您可以将比例更改仅应用于未在层次结构中选择的对中的对象。这样,这些对就不会相互竞争以重新调整自己的规模。

【讨论】:

  • 哦,这么近!这几乎有效。问题是,它只有一种方式。对象 A 可以很好地调整大小并且对象 B 匹配它,当然,但问题是,如果您尝试调整 B 的大小,它会不断引用脚本并将自身重置为 A 的比例 - 这正是我没有采取简单路线的原因首先有复杂的系统。
  • 我没有考虑从两个对象进行缩放。我已经编辑了我的答案来解决这个问题!
  • 我以前从未使用过Selection!我什至从未想过它存在!非常感谢!!
【解决方案2】:

所以我想通了。
我不确定我的原始代码什么有问题,但最终我决定进入旧的方便事件的领域:

[ExecuteInEditMode]
public class TransferRegion : MonoBehaviour {
    //...
    [SerializeField]
    private UnityEvent rescaled;
    //...
    void Update() {
        if (scale != gameObject.transform.localScale) {
            scale = gameObject.transform.localScale;
            rescaled.Invoke();
        }
    }
    //...
    public void OnPairRescaled() {
        gameObject.transform.localScale = pair.transform.localScale;
        scale = gameObject.transform.localScale;
    }
}

只需将 OnPairRescaled 事件设置为配对对象的 rescaled 事件的侦听器。

哒哒!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多