游戏中的检查点存储奇怪的值

问题描述 投票:0回答:1

我最近刚刚在 Unity 游戏引擎中的独立游戏中添加了一个新的检查点功能。检查点系统的工作方式是,当玩家触摸检查点时,它会将玩家的所有变换位置(x、y 和 z)作为 Vector3 存储到另一个脚本中。这些值完全不同,但是当玩家死亡并重生时,它会被发送到与脚本中存储的值完全不同的位置。 (主要是 y 位置。)所以这三件事都表现得很奇怪。

这是玩家第一次触摸检查点的检查点脚本。

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

public class Checkpoint : MonoBehaviour
{
    public Animator anim;
    public bool isChecked;
    public GameObject spawnPoint;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player") && !isChecked)
        {
            CheckpointController.instance.DeactivateCheckpoints();

            AudioManager.instance.PlaySFXNoPitch(3);

            isChecked = true;

            anim.SetBool("isChecked", true);

            CheckpointController.instance.SetSpawnPoint(PlayerController.instance.transform.position);
        }
    }

    public void ResetCheckpoint()
    {
        isChecked = false;
        anim.SetBool("isChecked", false);
    }
}

这是存储值的检查点控制器脚本:

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

public class CheckpointController : MonoBehaviour
{
    public static CheckpointController instance;

    Checkpoint[] checkpoints;

    public Vector3 spawnPoint;

    private void Awake()
    {
        instance = this;
    }

    void Start()
    {
        checkpoints = FindObjectsOfType<Checkpoint>();
    }

    public void DeactivateCheckpoints()
    {
        for(int i = 0; i < checkpoints.Length; i++)
        {
            checkpoints[i].ResetCheckpoint();
        }
    }

    public void SetSpawnPoint(Vector3 newSpawnPoint)
    {
        spawnPoint = newSpawnPoint;
    }
}

当玩家的位置类似于:X:38.6,Y:-2.8,Z:73时,检查点控制器存储X:6,Y:-1.3和Z:7。更奇怪的是,当玩家重生时,检查点控制器存储X:6,Y:-1.3和Z:7。玩家的transform.position类似于:X:26,Y:-4,& Z:80。

我将玩家的所有区域缩小到 0.2,因为原始版本对于游戏来说太大了,所以也许这就是问题所在?

有人可以帮我吗?

c# unity-game-engine 2d game-development
1个回答
0
投票

您遇到的问题似乎与播放器的缩放无关。该问题可能是由于您在

PlayerController.instance.transform.position
脚本中使用
Checkpoint
设置生成点而引起的。该值将传递给
SetSpawnPoint
脚本中的
CheckpointController
方法,该方法将
spawnPoint
的值设置为作为参数传递的值。

PlayerController.instance.transform.position
的值传递给
SetSpawnPoint
方法时,它的值可能不是您期望的值。您可以尝试添加一些调试语句来打印
PlayerController.instance.transform.position
的值,然后再将其传递给
SetSpawnPoint
方法,看看它是否符合您的期望。

您可以尝试的另一件事是使用不同的方法来设置生成点。例如,您可以尝试使用检查点游戏对象本身的位置作为生成点,而不是使用玩家的位置。您可以通过将

CheckpointController.instance.SetSpawnPoint(PlayerController.instance.transform.position);
脚本中的行
Checkpoint
更改为
CheckpointController.instance.SetSpawnPoint(transform.position);
来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.