我最近刚刚在 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,因为原始版本对于游戏来说太大了,所以也许这就是问题所在?
有人可以帮我吗?
您遇到的问题似乎与播放器的缩放无关。该问题可能是由于您在
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);
来完成此操作。