如何在 Unity 中创建输入名称脚本 [重复]

Posted

技术标签:

【中文标题】如何在 Unity 中创建输入名称脚本 [重复]【英文标题】:How to Create an Input Name Script in Unity [duplicate] 【发布时间】:2020-02-25 04:59:56 【问题描述】:

我在第一个场景中有一个名字输入脚本,计划是我想在第二个场景中调用这个输入,当我在第一个场景中输入名字时,名字也会出现在第二个场景中,如何你会这样做吗?

public class NamaUser : MonoBehaviour 

    public InputField nama;

    public Text teks;

    public void NamaTeks () 
        if (nama.text == "") 
            teks.text = "Harap Isi Nama";
         else 
            teks.text = "Namaku " + nama.text;
        
    

【问题讨论】:

【参考方案1】:

您可以保存输入值PlayerPrefs。 设置 PlayerPrefs:

//Name of Pref in first parameter
//Value in second parameter
PlayerPrefs.SetString("value", teks.value);

在第二个场景中获取 PlayerPref:

//Name of Pref in first parameter
//Returns value of PlayerPrefs
String a = PlayerPrefs.SetString("value");

缺点:

    您不仅可以在场景之间传递数据,还可以在实例之间(游戏会话)传递数据。 易于管理,因为 Unity 处理所有后台进程。 可用于存储数据以跟踪高分。

优点:

    使用文件系统。 可以轻松地从 prefs 文件更改数据。

【讨论】:

【参考方案2】:

或者,另一种方式——使用 Singelton 和 DontDestroyOnLoad()

允许轻松访问字段并在场景之间保存对象。

例如使用这个模板来创建你的类。

using UnityEngine;
public class Singelton<T> : MonoBehaviour where T : Singelton<T>


    private static T instance = null;

    private bool alive = true;

    public static T Instance
    
        get
        
            if (instance != null)
            
                return instance;
            
            else
            
                //Find T
                T[] managers = GameObject.FindObjectsOfType<T>();
                if (managers != null)
                
                    if (managers.Length == 1)
                    
                        instance = managers[0];
                        DontDestroyOnLoad(instance);
                        return instance;
                    
                    else
                    
                        if (managers.Length > 1)
                        
                            Debug.LogError($"Have more that one typeof(T).Name in scene. " +
                                            "But this is Singelton! Check project.");
                            for (int i = 0; i < managers.Length; ++i)
                            
                                T manager = managers[i];
                                Destroy(manager.gameObject);
                            
                        
                    
                
                //create 
                GameObject go = new GameObject(typeof(T).Name, typeof(T));
                instance = go.GetComponent<T>();
                DontDestroyOnLoad(instance.gameObject);
                return instance;
            
        

        //Can be initialized externally
        set
        
            instance = value as T;
        
    

    /// <summary>
    /// Check flag if need work from OnDestroy or OnApplicationExit
    /// </summary>
    public static bool IsAlive
    
        get
        
            if (instance == null)
                return false;
            return instance.alive;
        
    



    protected virtual void Awake()
    
        if (instance == null)
        
            DontDestroyOnLoad(gameObject);
            instance = this as T;
        
        else
        
            Debug.LogError($"Have more that one typeof(T).Name in scene. " +
                            "But this is Singelton! Check project.");
            Destroy(gameObject);
        

    

    protected virtual void OnDestroy()  alive = false; 

    protected virtual void OnApplicationQuit()  alive = false; 

使用示例:

class MyClass Settings : Singelton<Settings>

   string param;

【讨论】:

以上是关于如何在 Unity 中创建输入名称脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2008 中创建具有新名称的重复表

3、在Unity3D中创建一个脚本,默认继承哪个类。( )?

如何用Unity制作创建圆柱体模块

在 Unity 4.6 中从 C# 脚本创建 UI 按钮,无需任何预制件 [重复]

如何在 Javascript 中创建静态字段 [重复]

如何防止在 ADAM 中创建重复对象?