Между MoveTo и установить нового родителя одновременно - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь построить карточную игру и хочу переместить карту из родительского A в родительский B с анимацией. Первоначально родительский элемент карты является родительским A. Возможно ли использовать метод MoveTo для iTween, чтобы переместить карту из родительской области A в родительскую область B и установить родительского B в качестве родительского?

Рисунок

public void InitializeCards(int numOfCards) {
    for (int i = 0; i < numOfCards; i++) {
        GameObject card = PhotonNetwork.Instantiate(
            "CardDisplay",
            new Vector3(0, 0, 0),
            Quaternion.identity
        );
        card.transform.SetParent(table.transform, false);
        card.GetPhotonView().RPC("Initialize", RpcTarget.Others, false, null);
        card.GetPhotonView().RPC("Initialize", player, true, null);
        card.transform.SetParent(deck.transform, false);
    }
}

В этом методе я создаю карту, сначала устанавливаю ее родителя в таблицу, затем в методе Initialize я перемещаю карту из области стола в область колоды. Наконец я установил родителя в колоду.

[PunRPC]
void Initialize(bool isMine, string label) {
    if (label == null) {
        this.card = CreateRandomCard();
        this.label.text = this.card.label;
        this.number.text = this.card.number;
        Debug.Log(this.card.number);
        this.description.text = this.card.desc;
        this.typeText.text = this.card.type;
        this.cardImage.sprite = this.card.cardSprite;
    } else {
        switch (label) {
            case "Attack":
                this.card = new AttackCard();
                break;
            case "Defense":
                this.card = new DefenseCard();
                break;
            case "Heal":
                this.card = new HealCard();
                break;
            case "Take Card":
                this.card = new TakeCard();
                break;
            case "Special Attack":
                this.card = new SpecialAttack();
                break;
            case "Billizard":
                this.card = new BillizardCard();
                break;
            default:
                break;
        }
        this.label.text = this.card.label;
        this.number.text = this.card.number;
        this.description.text = this.card.desc;
        this.typeText.text = this.card.type;
        this.cardImage.sprite = this.card.cardSprite;
    }
    if (isMine) {
        GameManager.GetLocal().numOfcards++;
        iTween.MoveTo(this.gameObject, iTween.Hash("position", new Vector3(-400, -375, 0), "time", 1.5f, "islocal", true));
    } else {
        GameManager.GetRemote().numOfcards++;
    }
}

1 Ответ

0 голосов
/ 15 апреля 2020

См. SetParent

необязательный параметр

worldPositionStays
Если true, родительская относительная позиция , масштаб и вращение изменяются так, что объект сохраняет то же положение, вращение и масштаб в мировом пространстве, что и раньше.

и

Значение по умолчанию для аргумента worldPositionStays равно true .

card.transform.SetParent(deck.transform, false);

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


То, что вы скорее всего хотите, это сохранить мировую позицию , поэтому передать true (или ничего, поскольку true по умолчанию)

card.transform.SetParent(deck.transform);

равно

card.transform.SetParent(deck.transform, true);

равно простому присвоению Transform.parent

card.transform.parent = deck.transform;

Это очищено, теперь посмотрите на ваш метод:

card.transform.SetParent(table.transform);
card.GetPhotonView().RPC("Initialize", RpcTarget.Others, false, null);
card.GetPhotonView().RPC("Initialize", player, true, null);
card.transform.SetParent(deck.transform);

Два вопроса:

  • Это проходит без ожидание результатов, так что card.transform.SetParent(deck.transform); в основном называется "немедленно" и, вероятно, еще до того, как анимация началась Вы можете безоговорочно пропустить card.transform.SetParent(table.transform);
  • , также он не выполняет это на других клиентах, только один из которых выполняет InitializeCards. На всех других клиентах card будет сохранять своего исходного родителя (вероятно, null = scene root)

Вы бы предпочли использовать родительские функции в самом методе Initialize, который получает вызывается на всех клиентах и ​​делает это как обратный вызов после завершения moveTo или до его запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...