Четверг, 28 Марта 2024, 22:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Смещение при установке объекта на сцену (Необусловленное смещение объекта относительно Vector3.zero)
Смещение при установке объекта на сцену
MaxEggplantДата: Воскресенье, 22 Ноября 2020, 15:01 | Сообщение # 1
был не раз
Сейчас нет на сайте
Возникла проблема:
Собираю рамку из кусочков, заранее заданного размера.
Правая граница должна находиться на 0 по Х, тем не менее, по какой-то причине вся конструкция почему-то смещается влево и вперед на фиксированное значение, вне зависимости от размеров рамки.
Может быть у меня замылился глаз, и я просто уже не вижу строку, в которой сам когда-то присвоил это смещение.
Иначе - не догадываюсь в чем причина, от слова совсем. Хелп!
Ниже приведено изображение результата работы кода и сам код.
На картинке выделены оси X и Z для лучшей наглядности.

КАРТИНКА (пристите, сюда изображение прикрепляться не захотело)

Код

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CaseBuilder : MonoBehaviour
{
    public int _caseWidth;
    public int _caseHeight;

    public float _caseBlockSize = 0.5f;

    public string _CaseBlocksPath; //путь к префабам кейса
    public string _hinge; //префаб петли
    public string _handle; //префаб рукояти
    public string _angle; //префаб блока угла
    public string _wall; //префаб блока стены
    public string _floor; //префаб блока дна

    public Vector3 _startBuildPoint = Vector3.zero;

    public Vector3 _upLeft = Vector3.zero;
    public Vector3 _upRight = Vector3.up * 90;
    public Vector3 _downLeft = Vector3.up * 270;
    public Vector3 _downRight = Vector3.up * 180;

    public void BuildCase()
    {
        GameObject Case = SetGameObject(Vector3.zero, Vector3.one, "case");
        Case.AddComponent<CaseEngine>();
        BuildParts(SetGameObject(Vector3.zero, Vector3.one, "TopPart", Case.transform).transform,
            new Vector3(-_caseWidth * _caseBlockSize, 0, _caseHeight * _caseBlockSize));
    }
    public GameObject SetGameObject(Vector3 pos = new Vector3(), Vector3 size = new Vector3(), string name = "obj", Transform parent = null)
    {
        GameObject Obj = new GameObject(name);
        Obj.transform.SetParent(parent);
        Obj.transform.position = pos;
        Obj.transform.localScale = size;
        return Obj;
    }
    public GameObject LoadGameObject(string prefName, string name, Vector3 pos = new Vector3(), Vector3 rot = new Vector3(), Transform parrent = null)
    {
        GameObject InstObj = Instantiate(Resources.Load(_CaseBlocksPath + "/" + prefName), pos, Quaternion.identity, parrent) as GameObject;
        if (rot != Vector3.zero) InstObj.transform.rotation = Quaternion.Euler(rot);
        else InstObj.transform.rotation = Quaternion.Euler(Vector3.zero);
        if (name != null) InstObj.name = name;
        return InstObj;
    }
    public void BuildParts(Transform parrent, Vector3 startPos)
    {
        //_startBuildPoint = startPos + new Vector3(-_caseWidth * _caseBlockSize, 0, _caseHeight * _caseBlockSize);
        Vector3 BlockPosition = startPos;
        for (int y = 0; y < _caseHeight; y++)
        {
            for (int x = 0; x < _caseWidth; x++)
            {
                LoadGameObject(ChangeBlockShapePath(x, y), "Block", BlockPosition, ChangeBlockRotation(x, y), parrent);
                BlockPosition.x += _caseBlockSize;
            }
            BlockPosition.x = startPos.x;
            BlockPosition.z -= _caseBlockSize;
        }
    }
    public string ChangeBlockShapePath(int x, int y) //принимает (x,y) позицию, возвращает ссылку на блок соответствующий переданной позиции
    {
        string prefName = _wall;
        if ((x == 0 || x == _caseWidth - 1) && (y == 0 || y == _caseHeight - 1))
            prefName = _angle;
        else if ((x > 0 && x < _caseWidth - 1) && (y > 0 && y < _caseHeight - 1))
            prefName = _floor;
        else prefName = _wall;

        return prefName;
    }
    public Vector3 ChangeBlockRotation(int x, int y) //(осторожно, лапша)принимает (x,y) позицию, возвращает поворот объекта
    {
        Vector3 Rotation = Vector3.zero;
        if (!((x > 0 && x < _caseWidth - 1) && (y > 0 && y < _caseHeight - 1)))
        {
            if (x == 0) Rotation = _upLeft;
            if (y == 0) Rotation = _upRight;
            if (x == _caseWidth - 1) Rotation = _downRight;
            if (y == _caseHeight - 1) Rotation = _downLeft;

        }
        if ((x < 1 || x > _caseWidth - 2) && (y < 1 || y > _caseHeight - 2))
        {

            if (x == 0)
            {
                if (y == 0) Rotation = _upLeft;
                if (y >= _caseWidth - 1) Rotation = _downLeft;
            }
            else
            if (x == _caseWidth - 1)
            {

                if (y == 0) Rotation = _upRight;
                if (y >= _caseWidth - 1) Rotation = _downRight;
            }

        }
        return Rotation;
    }
}


Сообщение отредактировал MaxEggplant - Воскресенье, 22 Ноября 2020, 15:03
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Смещение при установке объекта на сцену (Необусловленное смещение объекта относительно Vector3.zero)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг