简体   繁体   中英

Unity 3D - Object position and its size

I have following problem with my Unity3D project. I will try to describe it on images.

第一张图片

在此处输入图片说明

So I want to merge to objects into 1. When object 1 and 2 collide, then they merge (object 2 became child of object 1). In practice I made it when bolt in object 1 (this blue "something" is bolt) collide with object 2, then they should merge. And I want to position object 2 on top of object 1 (saying top I mean where the red lines are, right image in second picture). So I decide to set localPosition of second object to be equal to bolt's localPosition (bolt is child of object 1 too). But that was wrong (second image, left side). So I get idea that I should add half of second object's height to one of his axis. But still it isn't perfect. And also I don't know to which axis I should add it. And should I use localPosition or normal position when I'm adding this half of height?

My code:

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

I have to add that objects can have different size, so I can't just add a number, it must be flexible. I will be very grateful for any help.

EDIT: This my whole code:

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

} }

I will explain what that means:

  • MainObject is the 1st object in picture.
  • c.gameObject.transform.parent.gameObject is the 2nd object from picture
  • gameObject is bolt (blue something in 1 object)
  • script is attached in bolt (blue something on picture)

just use the position of your first object and bounds.size:

vector3 posOfSecObject = new vector3(0,0,0);

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

I used the Y axis, I don't know which one you need, just try ;) I used this code to build a house composed of floors

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM