unity3d 问题是玩家的消失

ccgok5k5  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(203)

我的C#中有一个相当模糊的问题(Unity)代码。它在于这样一个事实,即我的球员消失,因为关于spawnpoint的规定行。因为他们,我的球员简单地消失,当我运行游戏可能的问题行是22,109 - 112.请帮助我解决这个问题。提前非常感谢但是我需要spawnpoint来做进一步的工作。提前非常感谢!
代码:

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

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    private void Awake()
    {
        if(GameManager.instance != null)
        {
            Destroy(gameObject);
            Destroy(player.gameObject);
            Destroy(floatingTextManager.gameObject);
            Destroy(HUD);
            Destroy(menu);
            return;
        }
        instance = this;
        SceneManager.sceneLoaded += LoadState;
        SceneManager.sceneLoaded += OnSceneLoaded;        
    }

    public List<Sprite> playerSprites;
    public List<Sprite> weaponSprites;
    public List<int> weaponPrices;
    public List<int> xpTable;

    public Player player;
    public Weapon weapon;
    public FloatingTextManager floatingTextManager;
    public Animator misMenuAnim;
    public RectTransform hitpointBar;
    public GameObject HUD;
    public GameObject menu;

    public int pesos;
    public int experience;

    public void ShowText(string msg, int fontSize, Color color, Vector3 position, Vector3 motion, float duration)
    {
        floatingTextManager.Show(msg, fontSize, color, position, motion, duration);
    }

    public bool TryUpgradeWeapon()
    {
        if (weaponPrices.Count <= weapon.weaponLevel)
            return false;

        if(pesos >= weaponPrices[weapon.weaponLevel])
        {
            pesos -= weaponPrices[weapon.weaponLevel];
            weapon.UpgradeWeapon();
            return true;
        }

        return false;
    }    

    public void OnHitpointChange()
    {
        float ratio = (float)player.hitpoint / (float)player.maxHitpoint;
        hitpointBar.localScale = new Vector3(1, ratio, 1);
    }

    public int GetCurrentLevel()
    {
        int r = 0;
        int add = 0;

        while(experience >= add)
        {
            add += xpTable[r];
            r++;

            if (r == xpTable.Count)
                return r;
        }

        return r;
    }

    public int GetXpToLevel(int level)
    {
        int r = 0;
        int xp = 0;

        while(r < level)
        {
            xp += xpTable[r];
            r++;
        }

        return xp;
    }

    public void GrantXp(int xp)
    {
        int currLevel = GetCurrentLevel();
        experience += xp;
        if (currLevel < GetCurrentLevel())
            OnLevelUp();
    }

    public void OnLevelUp()
    {
        player.OnLevelUp();
        OnHitpointChange();
    }

    public void OnSceneLoaded(Scene s, LoadSceneMode mode)
    {
        player.transform.position = GameObject.Find("SpawnPoint").transform.position;
    }

    public void Respawn()
    {
        misMenuAnim.SetTrigger("Hide");
        UnityEngine.SceneManagement.SceneManager.LoadScene("SampleScene");
        player.Respawn();
    }

    public void SaveState()
    {
       string s = "";

        s += "0" + "|";
        s += pesos.ToString() + '|';
        s += experience.ToString() + "|";
        s += weapon.weaponLevel.ToString();
    }

    public void LoadState(Scene s, LoadSceneMode mode)
    {
        SceneManager.sceneLoaded += LoadState;
        if (!PlayerPrefs.HasKey("SaveState"))
            return;

        string[] data = PlayerPrefs.GetString("SaveState").Split('|');

        pesos = int.Parse(data[1]);
        experience = int.Parse(data[2]);
        player.SetLevel(GetCurrentLevel());
        weapon.SetWeaponLevel(int.Parse(data[0]));
    }
}

在一个月的时间里,我试了很多方法,但没有一个能解决这个问题。

4ioopgfo

4ioopgfo1#

当你创建你的GameManager单例示例时,你也通过Destroy(player.gameObject)破坏了player,并且看起来不像你在创建一个新的播放器。这可能是原因吗?
您的OnSceneLoaded方法将playerGameObject的变换位置设置为名为“SpawnPoint”的GameObject的位置。您是否确保它位于所需的位置?您可以尝试使用F(用于focus)聚焦Scene View中的player,并确保它正在移动到所需的位置。
你还在Repawn()方法中调用了player.Respawn()。你是否仔细检查了这个将玩家传送到所需位置的功能?

相关问题