英文:
Make player go through walls (one way wall )
问题
我游戏中有一个功能,需要玩家穿过墙壁来解决谜题,我希望玩家只能穿过带有“Puzzle Wall”标签的墙壁一次,然后在时间结束后它将不再起作用(变成普通墙壁)。
如何使其工作(您可以编写新的代码,因为我的代码有2个错误)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Walls : MonoBehaviour
{
    private BoxCollider boxCollider;
    private bool hasBeenActivated = false;
    void Start()
    {
        Puzzle.OnPuzzleSolved += ActivateWall;                               
        boxCollider = GetComponent<BoxCollider>();
    }
    void Update()
    {
    
    }
    private void OnTriggerExit(Collider other)
    {
        if (hasBeenActivated)
        {
            boxCollider.isTrigger = false;
        }
    }
    private void ActivateWall(string wallTypeToActivate)
    {
        if (!hasBeenActivated && wallTypeToActivate == "Puzzle Wall")
        {
            boxCollider.isTrigger = true;
            hasBeenActivated = true;
        }
    }
}
错误1:我不能将任何内容传递给我的动作
错误2:空引用异常
错误3:玩家可以穿过所有墙壁
我尝试使用OnTriggerEnter/OnTriggerExit,但它给我错误。
我尝试使用碰撞矩阵,但问题依然存在,尽管它有效,但玩家仍然可以穿过墙壁。
英文:
I have a feature in my game were it requires the player to go through walls to slove the puzzle i want the player to only go through the wall that has the tag Puzzle Wall ONLY once then it will no longer work (become a normal wall) after the time end
How can i make it work (you can write a new code since mine has 2 errors  )
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Walls : MonoBehaviour
{
    // This script is for every wall in the game there is 5 types of walls 
    private BoxCollider boxCollider;
    void Start()
    {
        Puzzle.OnPuzzleSolved += ActivateWall("Puzzle Wall"); // why do i get this error                                
        boxCollider = GetComponent<BoxCollider>();
    }
  
    void Update()
    {
        
    }
    private void OnTriggerExit(Collider other)
    {
        boxCollider.isTrigger = false;
    }
    private void ActivateWall(string wallTypeToActivate)
    {
        if (wallTypeToActivate == "Puzzle Wall")
        {
            boxCollider.isTrigger = true;
        }
        else if (wallTypeToActivate 
   == " Fake Wall")
        {
            boxCollider.isTrigger = true;
        }
        else if (wallTypeToActivate 
     == "Puzzle Door")
        {
            boxCollider.isTrigger = true;
        }
        else
        {
            boxCollider.isTrigger
   = false;
      }
     }
    }
Error 1 i cant pass anything into my action
Error 2 null refrence execption
Error 3 player can go through all walls
I tried to use the on trigger enter / exist but it give me error
I tried using the collison matrix same issue it works but player still can go through it
答案1
得分: 0
我重构了你的代码并修复了错误。
在检视器中确保计时器值大于0。
using System.Collections;
using UnityEngine;
public class Walls : MonoBehaviour
{
    [SerializeField] private float time;
    // This script is for every wall in the game there are 5 types of walls
    private BoxCollider boxCollider;
    void Start()
    {
        boxCollider = GetComponent<BoxCollider>();
        Puzzle.OnPuzzleSolved += ActivateWall;
    }
    private void OnDisable()
    {
        Puzzle.OnPuzzleSolved -= ActivateWall;
    }
    private void Update()
    {
    }
    private void OnTriggerExit(Collider other)
    {
        switch (gameObject.tag)
        {
            // If the tag matches, we disable the collider on exit so the player can't go back
            case "Puzzle Wall":
                boxCollider.isTrigger = false;
                gameObject.GetComponent<Walls>().enabled = false;
                break;
            case "Fake Wall":
                boxCollider.isTrigger = true;
                break;
            case "Puzzle Door":
                boxCollider.isTrigger = true;
                break;
        }
    }
    private void ActivateWall()
    {
        boxCollider.isTrigger = true;
        StartCoroutine(StartTimer());
    }
    IEnumerator StartTimer()
    {
        yield return new WaitForSeconds(time);
        boxCollider.isTrigger = false;
    }
}
英文:
I refactored your code and fixed the errors
add a tag with the same name (case sensitive)
in the inspector make sure the timer value is > 0
using System.Collections;
using UnityEngine;
public class Walls : MonoBehaviour
{
    [SerializeField] private float time;
    
    // This script is for every wall in the game there is 5 types of walls 
    private BoxCollider boxCollider;
    void Start()
    {
        boxCollider = GetComponent<BoxCollider>();
        Puzzle.OnPuzzleSolved += ActivateWall;                         
    }
    private void OnDisable()
    {
        Puzzle.OnPuzzleSolved -= ActivateWall;
    }
    private void Update()
    {
        
    }
    private void OnTriggerExit(Collider other)
    {
        switch (gameObject.tag)
        { 
            //  if the tag matches We disable the collider on exit so 
            the player can't go back 
            case "Puzzle Wall":
                boxCollider.isTrigger = false;
                gameObject.GetComponent<Walls>().enabled = false;
                break;
            case "Fake Wall":
                boxCollider.isTrigger = true;
                    break;
            case "Puzzle Door":
                boxCollider.isTrigger = true;
                break;
        }
    }
    private void ActivateWall()
    {
       
       boxCollider.isTrigger = true;
        StartCoroutine(StartTimer());
    }
    IEnumerator StartTimer()
    {
        yield return new WaitForSeconds(time);
        boxCollider.isTrigger = false;
    }
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论