Как однозначно с позиционировать гейм объекты во время переключения между сценами?

184
30 апреля 2021, 09:20

У меня GameObject-ы вложены в родительский объект "Vehicles":

Во время переключения сцен я получаю родительский элемент "Vehicles" и задаю принудительно координаты дочерних GameObject-ов:

    ...
    void Awake () {
     ...
     SceneName = SceneManager.GetActiveScene().name;
     ...
    }
    ...
            void Start()
            {
              ...
              if (SceneName == "ShellingMovement") {
                    RTCTankController[] AllTank = GamObjList.GetComponentsInChildren<RTCTankController> ();
                    for (int i = 0; i<AllTank.Length; i++) {
                        if (AllTank[i].gameObject.name == "M-577" && transform.name == "M-577") {
                            transform.position = new Vector3 (1711.297f,48.28059f,4054.481f);
                            transform.rotation = new Quaternion (0.9680001f,168.872f,-8.359f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-113" && transform.name == "M-113") {
                            transform.position = new Vector3 (1706.262f,47.77866f,4078.819f);
                            transform.rotation = new Quaternion (-3.127f,169.286f,0.452f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-992" && transform.name == "M-992") {
                            transform.position = new Vector3 (1696.998f,44.37513f,4131.027f);
                            transform.rotation = new Quaternion (-7.449f,169.144f,8.141001f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (0)" && transform.name == "M-109 (0)") {
                            transform.position = new Vector3 (1600.354f,49.0132f,4241.434f);
                            transform.rotation = new Quaternion (-1.198f,121.643f,1.891f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (1)" && transform.name == "M-109 (1)") {
                            transform.position = new Vector3 (1653.597f,48.71995f,4208.654f);
                            transform.rotation = new Quaternion (9.178f,122.015f,-2.963f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (2)" && transform.name == "M-109 (2)") {
                            transform.position = new Vector3 (1679.346f,41.82598f,4192.982f);
                            transform.rotation = new Quaternion (5.686f,123.144f,6.354f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (3)" && transform.name == "M-109 (3)") {
                            transform.position = new Vector3 (1689.954f,41.07978f,4165.436f);
                            transform.rotation = new Quaternion (-3.909f,168.431f,6.052001f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (4)" && transform.name == "M-109 (4)") {
                            transform.position = new Vector3 (1701.619f,46.75608f,4103.15f);
                            transform.rotation = new Quaternion (-2.511f,169.421f,-1.173f,0f);
                            break;
                        } else if (AllTank[i].gameObject.name == "M-109 (5)" && transform.name == "M-109 (5)") {
                            transform.position = new Vector3 (1629.769f,51.90841f,4223.346f);
                            transform.rotation = new Quaternion (3.046f,121.521f,-3.36f,0f);
                            break;
                        }
                    }
                }
    ...
    }

Но у меня в результате получается что объекты позиционируются не в том месте, причем иногда даже что то правильно позиционируется, а что то не в том месте.

Пробовал даже сохранить объект во время переключения сцен:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DontDestroy : MonoBehaviour {
    void Start() {
        GameObject Vehicles = GameObject.Find ("Vehicles");
        DontDestroyOnLoad (Vehicles);
    }
}

Но тогда объекты сохраняют свое место положение относительно предыдущего положения в сцене.

Вопрос:

1 Как мне однозначно определить что объект должен иметь определенные координаты для старта когда я переключил сцену? Возникает впечатление что родительскому объекту надо задавать тоже координату.

2 Объясните, знающие форумчане, чем position, отличается от localPosition. В моём представление position - это позиционирование объекта не учитывая родительский элемент, а localPosition - это позиционирование объекта относительно родительского. Так ли это ?

Скрипт перемещения объекта у меня такой :

...
    void EnemyMovement()
    {
        if (pathContainer != null)
        {
            if (this.LeaderGObjInstance!=null && this.LeaderGObjInstance.gameObject.name!=transform.name) {
                float DistanceObj = Vector3.Distance(transform.position,GameObject.Find (this.LeaderGObjInstance.gameObject.name).transform.position);
                System.Random r = new System.Random ();
                var space = r.Next (15, 30);
                if ( DistanceObj > (float)space) {
                    speed=speed+0.1f;
                    if(speed>6) {
                        speed = 6;
                    }
                } else if (DistanceObj < (float)space) {
                    speed=speed-0.3f;
                    if (speed<=0) {
                        speed = 0; 
                    }
                } else {
                }
            } else {
                //Debug.Log ("LeaderGObjInstance==null");
            }
            float range = speed * Time.deltaTime;
            Vector3 relativePos = current_waypoint - transform.position;//relativePos is the distence left to current waypoint
            Waypoint_selecetion_code(relativePos);
            current_waypoint = pathContainer.waypoints[currentPoint].position + new Vector3(0, sizeToAdd, 0);
            if (SceneName == "ShootingOne" || SceneName=="ShootingDefeat") {
                RotationCamera ();
                transform.position = Vector3.MoveTowards(transform.position + new Vector3(0, sizeToAdd, 0), pathContainer.waypoints[currentPoint].position, range - ddelta);
            } else if ( SceneName== "ShellingMovement" ) {
                Face_waypoint(relativePos);
                transform.position = Vector3.MoveTowards(transform.position + new Vector3(0, sizeToAdd, 0), pathContainer.waypoints[currentPoint].position, range - ddelta);
                Moveobject();
            } else {
                // time += Time.deltaTime*(range - ddelta);
                // Debug.Log (time);
                if(currentPoint == 0 && SceneName== "Library") {
                    transform.position = pathContainer.waypoints [currentPoint].position;
                }
                Face_waypoint(relativePos);
                transform.position = Vector3.MoveTowards(transform.position + new Vector3(0, sizeToAdd, 0), pathContainer.waypoints[currentPoint].position, range - ddelta);
                Moveobject();
            }
        }
    }
...
Answer 1

localPoisition - это позиция объекта относительно позиции его родителя
position - это позиция объекта относительно мировых координат

Если вы измените position родителя - все дочерние объекты переместятся вместе с ним так, чтобы сохранить свой localPosition.

Так что, да - вам нужно двигать только родителя.

READ ALSO
GetExternalLoginInfoAsync при авторизации через Facebook возвращает null

GetExternalLoginInfoAsync при авторизации через Facebook возвращает null

Я добавил авторизацию через facebook в Startup, решил уже туда все что можно запихать в попытках решить проблему:

90
wpf dependency property add owner

wpf dependency property add owner

В книге Петцольда есть следующий пример:

109
Как записать консольный код AngleSharp в форме?

Как записать консольный код AngleSharp в форме?

На вебстранице показан код парсера в консолиХотелось бы научиться получать результат парсинга сайта в textbox формы

101