Unity 3D - 对象位置及其大小

问题描述 投票:0回答:1

我的 Unity3D 项目遇到以下问题。我会尝试用图像来描述它。

first image

enter image description here

所以我想将对象合并到1中。当对象1和2碰撞时,它们会合并(对象2成为对象1的子对象)。在实践中,当对象 1 中的螺栓(这个蓝色“东西”是螺栓)与对象 2 碰撞时,我做到了,然后它们应该合并。我想将对象 2 放置在对象 1 的顶部(说顶部是指红线所在的位置,第二张图片中的右图)。因此,我决定将第二个对象的

localPosition
设置为等于 Bolt 的
localPosition
(bolt 也是对象 1 的子对象)。但这是错误的(第二张图,左侧)。所以我想到我应该将第二个物体的高度的一半添加到他的轴之一。但它仍然不完美。而且我也不知道应该将其添加到哪个轴。当我添加这一半高度时,我应该使用
localPosition
还是正常
position

相关代码:

void OnTriggerEnter(Collider c) {
   if(transform.IsChildOf(mainObject.transform)) {
      childObject.transform.SetParent (mainObject.transform);
      childObject.transform.localPosition = boltObject.transform.localPosition;
      childObject.transform.position = new Vector3 (childObject.transform.position.x, childObject.transform.position.y, (float)(childObject.transform.position.z + childObject.GetComponent<Renderer>().bounds.size.z));
   }
}

我必须补充一点,对象可以有不同的大小,所以我不能只添加一个数字,它必须是灵活的。我将非常感谢任何帮助。

全班:

using UnityEngine;
using System.Collections;

public class MergeWithAnother : MonoBehaviour {

    public GameObject mainObject;

    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {
   
    }

    void OnTriggerEnter(Collider c) {
      if(transform.IsChildOf(mainObject.transform)) {
         if (c.gameObject.name == "holeForBolt" && c.gameObject.transform.parent.gameObject != mainObject) {
            Destroy (c.gameObject.transform.parent.gameObject.GetComponent("MouseDrag"));
            Destroy (c.gameObject.transform.parent.gameObject.GetComponent("RotateObject"));

            c.gameObject.transform.parent.gameObject.transform.SetParent (mainObject.transform);
            c.gameObject.transform.parent.gameObject.transform.localPosition = gameObject.transform.localPosition;
                                c.gameObject.transform.parent.gameObject.transform.position = new Vector3 (c.gameObject.transform.parent.gameObject.transform.position.x, c.gameObject.transform.parent.gameObject.transform.position.y, (float)(c.gameObject.transform.parent.gameObject.transform.position.z + c.gameObject.transform.parent.gameObject.GetComponent<Renderer>().bounds.size.z));

            c.gameObject.transform.parent.gameObject.transform.localRotation = gameObject.transform.localRotation;
            c.gameObject.transform.parent.gameObject.transform.localRotation = new Quaternion (360 + c.gameObject.transform.parent.gameObject.transform.localRotation.x, c.gameObject.transform.parent.gameObject.transform.localRotation.y, c.gameObject.transform.parent.gameObject.transform.localRotation.z, c.gameObject.transform.parent.gameObject.transform.localRotation.w);

            Destroy (c.gameObject.transform.parent.gameObject.GetComponent<CapsuleCollider>());
            Destroy (gameObject);
            Destroy (c.gameObject);

            CapsuleCollider cc = mainObject.GetComponent<CapsuleCollider>();

            cc.height *= 2;
            cc.center = new Vector3(0, 0, 1);
         }
      }
   }
}

我将解释这意味着什么:

  • MainObject 是图片中的第一个对象。
  • c.gameObject.transform.parent.gameObject
    是第二个对象 图片
  • gameObject
    是螺栓(1个物体中的蓝色东西)
  • 脚本附在螺栓上(图片上有蓝色的东西)
c# unity-game-engine
1个回答
0
投票

只需使用第一个对象的位置和bounds.size:

向量3 posOfSecObject = 新向量3(0,0,0);

posOfSecObject.y += FIRSTOBJECT.GetComponent().Renderer.bounds.size.y;

我用的是Y轴,我不知道你需要哪一个,试试吧;)我用这段代码建造了一座由楼层组成的房子

© www.soinside.com 2019 - 2024. All rights reserved.