Масштабирование игровых объектов, когда для transform.parent установлено значение null - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над небольшой игрой, в которой предметы помещаются в лодку, а затем нажатие клавиши заставляет лодку «плыть».

Чтобы переместить все объекты, которые стоят на лодке, я устанавливаю родителя каждого объекта на пустой направляющий объект в лодке, затем меняю положение лодки.(Я также пытался добавить родительские объекты в объект лодки)

Ниже приведен скрипт, применяемый к объекту лодки.

переменные, установленные в классе BoatScript:

public class BoatScript : MonoBehaviour {
    public List<string> boatList;
    public KeyCode interact;
    public GameObject tempObject;
    public string whichSide;
    public string direction;
    public bool canSail;
}

Метод запуска и обновления:

void Start () {

    canSail = false;
    whichSide = "start";
    direction = "toFinish";
    speed = 0f;
}

void Update () {

    if (canSail == true)
    {
        SetSail();
    }

    if (boatList.Contains("FARMER") && whichSide == "start" && Input.GetKeyDown(interact))
    {
        speed = 0.5f;
        CharacterCheck();
    }
    else if (boatList.Contains("FARMER") && whichSide == "finish" && Input.GetKeyDown(interact))
    {
        speed = -0.05f;
        CharacterCheck();
    }   

}

Вот мои методы OnTrigger:

void OnTriggerEnter(Collider other)
{
    Debug.Log(other.gameObject.name + " collided with " + gameObject.name);
    promptText.text = "";

    if(CheckValidObject(other.gameObject.name) == true) { 

        boatList.Add(other.gameObject.name);
        logBox.text = logBox.text + "\nThe " + other.gameObject.name + " is in the boat";
    }

    if (other.gameObject.name == "FARMER")
    {
        promptText2.text = "Press E to set sail";
    }

}

void OnTriggerExit(Collider other)
{
    boatList.Remove(other.gameObject.name);
    logBox.text = logBox.text + "\nThe " + other.gameObject.name + " has left the boat";
    promptText.text = "";

    if (other.gameObject.name == "FARMER")
    {
        promptText2.text = "";
    }

}

Парус:

void SetSail()
{
    promptText.text = "";
    promptText2.text = "";

    addParents();

    if (whichSide == "sailing" && direction == "toFinish")
    {
        speed = 0.05f;
        gameObject.transform.Translate(speed, 0, 0);
    }
    else if (whichSide == "sailing" && direction == "toStart")
    {
        speed = -0.05f;
        gameObject.transform.Translate(speed, 0, 0);
    }
    else if (whichSide == "start" || whichSide == "finish")
    {
        gameObject.transform.Translate(speed, 0, 0);
        removeParents();
    }
}


void addParents()
{
    foreach(string o in boatList)
    {
        GameObject obj = GameObject.Find(o);
        obj.GetComponent<Rigidbody>().useGravity = false;
        obj.GetComponent<Rigidbody>().isKinematic = true;
        if (obj.name == "FARMER") { obj.transform.parent = playerGuide.transform; }
        else {obj.transform.parent = itemGuide.transform; }

    }    

}

void removeParents()
{
    foreach (string o in boatList)
    {
        GameObject obj = GameObject.Find(o);
        obj.GetComponent<Rigidbody>().useGravity = true;
        if(obj.name != "FARMER") {obj.GetComponent<Rigidbody>().isKinematic = false; }        
        obj.transform.parent = null;
    }
}

Проблема: Однажды лодкадостигает и ударяет коллайдер с другой стороны, лодка останавливается, как и ожидалось, но объекты, которые были только что удалены от родителя, начинают непрерывно увеличиваться, как это:

например, 1 https://i.gyazo.com/d35ae729757b8e71c25fd1b4a3857dae.mp4

например, 2 https://i.gyazo.com/80637919bfd114a42d187300b7faef25.mp4

Я не слишком уверен, что вызывает это.Спасибо за любую помощь, спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вместо установки родителя с помощью transform.parent, используйте transform.SetParent(targetTransform, false);.Второй параметр, bool, определяет, сохранит ли трансформация игрового объекта свою позицию, ориентацию и масштаб.Установив для него значение false, преобразование сохранит свои текущие значения, а установив его в значение true, изменит положение, ориентацию и масштаб, чтобы сохранить мировое положение.Вы можете проверить это для получения дополнительной информации transform.SetParent

0 голосов
/ 22 октября 2018

Вы уверены, что он расширяется, а не перемещается по осям Z?Из того, что я смотрю, оно идет к камере, но не расширяется.Вы должны отладить позицию и масштаб в методе обновления, чтобы увидеть, что там на самом деле происходит.

Комментарий ниже: «Ну, тогда вам придется отлаживать его более тщательно, я сначала попробую, установив для canSail значение false, как толькокогда он достигает конца. Возможно, метод addParent, который всегда выполняется, неправильный, что делает объект itemGuide? edit: я только что видел второе видео, с моей точки зрения, которое кажется серьезным, что вы имели в виду при проблемах с масштабированием:потому что он выходит из лодки? "

Решение:

void SetSail()
{
    promptText.text = "";
    promptText2.text = "";

    addParents();

    if (whichSide == "sailing" && direction == "toFinish")
    {
        speed = 0.05f;
        gameObject.transform.Translate(speed, 0, 0);
    }
    else if (whichSide == "sailing" && direction == "toStart")
    {
        speed = -0.05f;
        gameObject.transform.Translate(speed, 0, 0);
    }
    else if (whichSide == "start" || whichSide == "finish")
    {
        gameObject.transform.Translate(speed, 0, 0);
        canSail = false; //Adding this line solves the issues, must have been affecting transform properties to child objects.
        removeParents();
    }
}
...