Как перенести данные между сценами в Unity? - PullRequest
0 голосов
/ 04 января 2019

В игре, которую я разрабатываю, у меня есть роль, когда пользователь, находящийся слишком близко к врагу, переключает сцену на сцену сражения.Однако я понятия не имею, как загрузить этого врага на экран битвы (учитывая, что пользователь может сражаться с множеством разных врагов).Ниже моя текущая треска для врага.Мне было интересно, смогу ли я перенести это имя в следующую сцену или что-то в этом роде.Я просто хочу, чтобы мой враг переходил с одного экрана на другой, когда сцена изменилась.Код будет признателен, спасибо

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

public class FolllowAndLoad : MonoBehaviour
{
public Transform target;
public Animator anim;
public Rigidbody2D myRigidBody;
public string levelToLoad;
private static string keyname; // value I want to carry over
public float MoveSpeed;
private bool checkTrigger;
public Rigidbody2D targetRigidBody;



void Start()
{
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();//getting the position of our player

    anim = GetComponent<Animator>();
    myRigidBody = GetComponent<Rigidbody2D>(); //getting my components

    targetRigidBody = GameObject.FindGameObjectWithTag("Player").GetComponent<Rigidbody2D>();

}

void Update()
{
    float distance = Vector2.Distance(target.position, myRigidBody.transform.position); //getting the distance between our player and our enemy
    if (distance < 5)
    {
        transform.position = Vector2.MoveTowards(transform.position, target.position, MoveSpeed * Time.deltaTime); //moving our enemy towards our player
        anim.SetBool("checkTrigger", true);
        anim.SetFloat("MoveX", moveXvalue()); //updating the animations for our enemy
        anim.SetFloat("MoveY", moveYvalue());

    }
    else if (distance > 5)  //if out of range stop walking
    {
        anim.SetBool("checkTrigger", false);

    }
}

int moveXvalue()
{
    int value;

    if (myRigidBody.transform.position.x < target.transform.position.x && Mathf.Abs(target.position.y - myRigidBody.position.y) < Mathf.Abs(target.position.x - myRigidBody.position.x)) //these are saying if the enemy is closer in x than in y use x animations and vice versa
        value = 1;
    else if (myRigidBody.transform.position.x > target.transform.position.x && Mathf.Abs(target.position.y - myRigidBody.position.y) < Mathf.Abs(target.position.x - myRigidBody.position.x))
        value = -1;
    else
        value = 0;
    return value;
}

int moveYvalue()
{
    int value;

    if (myRigidBody.transform.position.y < target.transform.position.y && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x))
        value = 1;
    else if (myRigidBody.transform.position.x > target.transform.position.x && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x))
        value = -1;
    else
        value = 0;
    return value;
}

public void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.name == "Player")
    {
        Debug.Log(gameObject.name);

        anim.SetBool("checkInContact", true);

        Application.LoadLevel (levelToLoad); //loading our level


        }
    }
}

1 Ответ

0 голосов
/ 04 января 2019

Есть много способов сделать это, но самый простой способ заставить что-то работать быстро, пока вы не познакомитесь с Unity, чтобы использовать простой статический класс в вашем проекте, к которому вы можете получить доступ из любого скрипта в любой сцене .

Так что если вы сейчас создадите новый скрипт в своем проекте с именем SharedResources.cs, а затем вставите его в скрипт и сохраните его ...

public static class SharedResources
{
    public const int kSceneIs_TitleScene = 0;
    public const int kSceneIs_ActualGameScene = 1;
    public const int kSceneIs_HighScoreScene = 2;

    public static int highScore = 0;
    public static int enemyID = 0;

    public static void sampleFunction()
    {
        //this is a sample method you can call from any other script
    }

}

Теперь вы можете быть в сценарии в одной сцене и сделать это

SharedResources.highScore=SharedResources.highScore+20;
SharedResources.enemyID=5;

Затем вы можете открыть новую сцену, и сценарий в этой сцене может получить доступ к рекорду

Debug.Log(SharedResources.highScore)
Debug.Log(SharedResources.enemyID)

Вы также можете получить доступ к постоянным и запускать подпрограммы, которые находятся в статическом классе, как показано выше.

Правильный способ сделать это - спорить и действительно зависит от вашей конечной цели. Я сошлюсь на другую ссылку на пост, который будет более подробно ....

https://gamedev.stackexchange.com/questions/110958/unity-5-what-is-the-proper-way-to-handle-data-between-scenes

В идеале вы должны прочитать и понять разницу между использованием простого статического класса по сравнению с классом, производным от MonoBehavior, а также разницу между статическим классом и синглтоном, который во многих отношениях гораздо более мощный (но также может вызвать выдает, если не правильно его кодировать)

И последнее, но не менее важное: не забывайте, что вы также можете использовать встроенную функцию PlayerPrefs в Unity для хранения результатов и других настроек, которые необходимо перенести между запусками игры ....

https://answers.unity.com/questions/1325056/how-to-use-playerprefs-2.html

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