gpt4 book ai didi

c# - 当 Key 被 Player Unity 2d 捕获时进入下一关

转载 作者:行者123 更新时间:2023-12-03 23:16:40 24 4
gpt4 key购买 nike

我需要一些帮助来实现我正在为使用 Unity 2D 制作的游戏实现的功能。玩家必须拿 key 才能打开门(可能会显示动画),当玩家拿着 key 走到那扇门前时,他会自动进入下一关。我需要帮助,因为门无法进入下一层。

这是关键代码/脚本:

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

public class KeyScript : MonoBehaviour {

//public AudioSource coinSoundEffect;
public AudioClip key1;

void Awake () {

//source = GetComponent<AudioSource>();
}

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
void OnCollisionEnter2D (Collision2D other) {
Debug.Log("Chiave Presa");

if(other.gameObject.tag =="Player")
GameObject.Find("KeyDoor").SendMessage("HitKey");
SoundManager2D.playOneShotSound(key1);
}

}

这是 DOOR 代码/脚本:

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

public class DoorScript : MonoBehaviour {

public bool key = false;
public string nextLevelName;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

void HitKey (){
Debug.Log("La porta è sbloccata");
key = true;
Destroy (GameObject.Find ("Key"));
}


void OnCollisionEnter2D (Collision2D other){
if(other.gameObject.tag == "Player"){
if (key == true){
Application.LoadLevel(nextLevelName);
//Destroy(gameObject);
//GameObject.Find("Key").SendMessage("DestroyKey"); //If you also want to destroy the key
//GoToNextLevel ();

}
}
}

void OnTriggerEnter2D (Collision2D other)
{
Application.LoadLevel(nextLevelName);
}

public virtual void GoToNextLevel()
{
//loadingImage.SetActive(true);
Application.LoadLevel(nextLevelName);

}


}

代码有效,但当玩家走到门前时,他并没有进入下一关。任何帮助或提示表示赞赏。干杯

最佳答案

首先,你错过了一件事:

是基于组件的引擎

这意味着您应该在 Component 之间进行交互,而不是在 GameObject 之间进行交互。

在您的脚本中有一个 public 字段 public bool key 不应从外部访问。但是,如果您正在寻找会起作用的简单且错误的答案,那么您只需替换这一行即可:

GameObject.Find("KeyDoor").SendMessage("HitKey");

进入这个:

GameObject.Find("KeyDoor").GetComponent<DoorScript>().key = true;

在那种情况下,您最终会得到困惑的代码和不稳定的游戏。作为一个不错的选择,我可以向您推荐的是稍微重写您的逻辑。

你可以创建一个 Component 而不是创建一个不需要的 MonoBehaviour :

public class KeyComponent : Component
{
[SerializeField]
AudioClip m_KeyPickupSound;

[SerializeField]
bool m_IsPickedUp;

public bool PickedUp
{
get { return m_IsPickedUp; }
}

public void PickUp()
{
m_IsPickedUp = true;
SoundManager2D.playOneShotSound(m_KeyPickupSound);
}
}

现在将其附加到您的 PlayerComponent 列表中,并在您的门脚本中执行:

void OnCollisionEnter2D (Collision2D other)
{
if(other.GetComponent<KeyComponent>() != null && other.GetComponent<KeyComponent>().PickedUp)
{
SceneManager.LoadScene(2);
}
}

现在唯一剩下的就是更新您的 PlayerMonoBehaviour 并添加简单的碰撞检查:

void OnCollisionEnter2D(Collision2D other)
{
if(other.tag == "TAG_FOR_KEY")
GetComponent<DoorScript>().PickUp();
}

现在您正在与 Component 而不是 GameObject 进行交互,这样更改一些脚本就需要更少的努力。

关于c# - 当 Key 被 Player Unity 2d 捕获时进入下一关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42092344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com