2015-10-14 246 views
2

我正在研究Unity中的一个项目,该项目涉及将任何非静态对象从一个传送到配对的区域。这部分很好,但为了方便,我试图编写脚本的一部分,它将调整一个对象的大小,如果它的对被调整大小,这样它们将总是具有相同的大小。到目前为止它的工作 - 大多数。我遇到的唯一问题是当试图通过Transform组件调整大小时 - 例如,在Inspector中键入数字,或者在X或Y或Z上使用值滑块。这些手柄工作正常。我想,这并不是什么大不了的事,但如果我能弄清楚为什么这样做不行,所以我可以学会将来做什么,我会很高兴。下面的代码:Unity - 调整一个GameObject的大小以匹配另一个

[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... 
} 

如果任何人都可以看到一些重大的逻辑错误我做的,我想知道。如果我的代码有点难以理解,我也可以解释一下我的逻辑流程,我知道我很容易产生一些令人困惑的结构。
谢谢大家。

+0

你的代码是做什么的?它不是做什么的?如果不通过“变换”,你如何缩放? – 31eee384

+0

代码查看应用对象是否已调整大小,如果有,则调整配对对象的大小。更确切地说,如果GameObject的当前比例与先前记录的比例不同,在这种情况下,它将'scaleManuallyAltered'标志设置为true,然后重置scale变量,然后检查其他GameObject是否已经调整大小;如果没有,则会将该对中的比例更改为当前比例。 – BHustus

+0

哦,对。我正在看*的代码几乎可以工作。关键的失败:它似乎并不喜欢在一个对象或另一个对象上的Transform组件中接受手动,编号类型的缩放编辑。我不确定你的意思是“不通过变换” - 因为我认为我*是*。 – BHustus

回答

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; 
     } 
    } 
} 

我测试了这个在我的场景两个立方体。我可以使用小工具来调整大小,也可以手动在检查器中的变换编辑字段中输入数字。

编辑:通过利用Selection,可以将比例更改仅应用于层次结构中未选中对中的对象。这种方式不会互相竞争来扩大自己的规模。

+0

哦,太近了! *几乎*可用。问题是,它的工作原理*只有一种方法*。对象A被调整得很好,对象B与它匹配,当然,但问题是,如果你尝试调整B的大小,它会不断地引用脚本并将其自身重置为A的比例 - 这正是我为什么不采取简单的路线和首先有错综复杂的系统。 – BHustus

+0

我没有考虑从两个对象缩放。我编辑了我的答案来解决这个问题! –

+0

我以前从未使用过Selection!我从来没有想过它存在!非常感谢!! – BHustus

0

所以我想通了。
我不知道什么错了我的原代码,但最终我还是决定滑入好的老得心应手事件的境界:

[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事件。

Ta-da!

相关问题