如何在unity中获取对象的大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在unity中获取对象的大小相关的知识,希望对你有一定的参考价值。

参考技术A 条件一:对象A不存在父级对象,我们可以通过localScale获取对象实际尺寸。
条件二:对象A存在一个父级对象B,而父级对象B不存在父级(爷级),我们可以通过localScale获取相对父级B的缩放比例sizeA,然后在获取父级对象B的尺寸sizeB,然后通过计算sizeA * sizeB活的对象A的实际尺寸。
条件三:对象A存在父级对象B,而父级对象B又存在父级对象C,C还存在父类D。。。。。依次嵌套,除了使用递归,Unity3D有没有什么办法可以直接获得对象A实际尺寸?谢谢

在 Unity 中,如何将值从一个脚本传递到另一个脚本?

【中文标题】在 Unity 中,如何将值从一个脚本传递到另一个脚本?【英文标题】:In Unity, how can I pass values from one script to another? 【发布时间】:2012-12-15 11:49:01 【问题描述】:

在 Unity 中,我希望一个对象具有所有其他对象都可以访问的下降速度变量。由于各种原因,我无法使用内置的重力来做我想做的事情。

如何重复访问一个对象中的变量,以便在它更新时从另一个对象获取更新后的变量?

【问题讨论】:

在全局范围内声明?我以为 Unity 使用了 javascript,但 C# 标签让我失望了。 @JanDvorak 在 Unity 中,您可以使用 UnityScript(他们的 javascript 版本)或 C#。 Unity 可以使用 JavaScript、C~ 或 Boo(一种 python 风格,相当新的语言) 我相信c# 有一个可以使用的静态(类本地)范围。也许这就是你应该放置它的地方。 我需要为每个脚本定义一个新类。在脚本中,我可以轻松传递值,只是不知道如何从外部进行。 【参考方案1】:

有几种方法可以实现这一点。

如果您希望速度变量由附加到游戏对象 MyObject 的组件控制

public class SpeedController : MonoBehaviour
    public float speed;
    // maybe you want restrict this to have read access, then you should use a property instead

在其他课程中你可以这样做:

GameObject go = GameObject.Find ("MyObject");
SpeedController speedController = go.GetComponent <SpeedController> ();
float courrentSpeed = speedController.speed;

注意只有一个名为 MyObject 的对象,否则事情就会一团糟。

或者,您可以在需要访问 speed 的每个类中定义一个 SpeedController 成员,并通过在 Unity 编辑器中拖放来设置引用。然后保存查找,但如果在许多类中需要,这当然很不方便。


另一种方法是创建一个包含speed 变量的单例,并具有:

public class MyGlobalSpeedController 
    private static MyGlobalSpeedController instance = null;
    public static MyGlobalSpeedController SharedInstance 
        get 
            if (instance == null) 
                instance = new MyGlobalSpeedController ();
            
            return instance;
        
    
    public float speed;
   

所以所有类都可以访问这个:

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

正如 Jan Dvorak 在 cmets 部分所述:

public class SpeedController : MonoBehaviour
    public static float speed;

[更新] 感谢杰达克。是的Component.SendMessage 绝对应该在名单上:

go.SendMessage("GetFallingSpeed");

同样,您需要引用go,如第一个解决方案中所述。

这个问题还有更多的解决方案。如果您正在考虑在所有场景中都处于活动状态的游戏对象,您应该看看Unity singleton manager classes

【讨论】:

别忘了SendMessage 这是def。不是最好的选择,但有时很有用。 我不断收到此错误:'错误 CS0236:字段初始值设定项无法引用非静态字段、方法或属性'(我正在使用您的第一种方法) 这里:SpeedController speedController = go.GetComponent(); @Dakeyras 好像你在初始化成员变量时这样做。也许A realy easy c# question 对此有所了解。 属性部分错误。该属性是静态的,而该字段不是,因此它无法返回它,因为它无法访问它。【参考方案2】:

如果我是你,我会将这个速度变量设为“静态公开”,这样你就可以从任何地方访问它。您应该始终避免使用“find.anything”等功能,它们非常慢。你没有理由去寻找你确切知道它在哪里的东西。

【讨论】:

我正在阅读这些答案,想知道这个有什么问题?【参考方案3】:

如果是在fixedUpdate中--Martin j

似乎它在 Awake 中也很有效。两个脚本都添加到同一个 GameObject 中。

public class FirstScript : MonoBehaviour 
    protected internal GameObject myobject;
private void Awake() 
       myobject = (GameObject)Instantiate(Resources.Load("nameofprefab"));
       myobject.transform.parent = gameObject.transform;
...
public class SecondScript : MonoBehaviour 
    private GameObject myobject;
private void Awake() 
       myobject = gameObject.GetComponent<FirstScript>().myobject;
       myobject.SetActive(false); //for example
...       

【讨论】:

【参考方案4】:
other.GetComponent<class name>().object name;

【讨论】:

如果在fixedUpdate中

以上是关于如何在unity中获取对象的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 中从 3D 对象中获取 2D 视图/纹理

如何在unity3d中查找子对象

Unity3D:将所有游戏对象转换为相同大小,而不管其比例如何

如何在 Unity 的另一个场景中访问游戏对象 [重复]

unity UGUI如何获取鼠标指针所在位置的UI对象

unity如何快速选择网格筛除空对象