Unity 2D 游戏中不出现精灵

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

我正在创建一个用于练习的 2D Top Down 游戏,我需要一些帮助。就上下文而言,这是一款 2D 俯视射击游戏,您可以在其中移动和射击敌人。敌人有一个基本的半径系统,如果玩家进入半径内,它就会接近玩家。

现在我正在制作一个游戏机制,玩家可以躲在纸板箱里,玩家可以按“E”,他会突然变成一个纸板箱,如果玩家在纸板箱里,敌人就不会即使玩家在半径内,也不会检测到他。是的,就像合金装备一样。现在我已经创建了预制件和所有功能,它工作得很好。如果你按“E”,敌人就无法发现你。

现在的小问题是纸板箱没有出现,所以只是玩家完全消失了。我不知道是什么导致了这个问题。

对于上下文,这些是我的脚本。随意阅读或不阅读它们:)

玩家控制器:

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

public class PlayerController : MonoBehaviour
{
    public float moveSpeed;
    public GameObject bulletPrefab;
    public GameObject player;
    private Rigidbody2D rb2d;
    private Vector2 moveDirection;
    [SerializeField] private Camera cam;
    [SerializeField] private GameObject gunPoint;
    public bool isHiding = false;
    [SerializeField] private GameObject cardboardBox;
    [SerializeField] private GameObject gunSprite;

    // Start is called before the first frame update
    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
        cardboardBox.SetActive(false); // Hide the cardboard box when the game starts
        gunSprite.SetActive(true); // Show the gun sprite when the game starts
    }

    // Update is called once per frame
    void Update()
    {
        CheckCursor();
        ProcessInputs();
        // Make the camera follow the player
        cam.transform.position = new Vector3(player.transform.position.x, player.transform.position.y, cam.transform.position.z);

        // Check if player pressed the "E" key to toggle the cardboard box
        if (Input.GetKeyDown(KeyCode.E))
        {
            isHiding = !isHiding; // Toggle the isHiding variable
            cardboardBox.SetActive(isHiding); // Show/hide the cardboard box accordingly

            // If player is hiding, stop player movement
            if (isHiding)
            {
                moveDirection = Vector2.zero;
                player.GetComponent<SpriteRenderer>().enabled = false;
                cardboardBox.GetComponent<SpriteRenderer>().enabled = true;
                gunSprite.SetActive(false); // Hide the gun sprite when the player is hiding
            }
            else
            {
                player.GetComponent<SpriteRenderer>().enabled = true;
                cardboardBox.GetComponent<SpriteRenderer>().enabled = false;
                gunSprite.SetActive(true); // Show the gun sprite when the player is not hiding
            }
        }
    }

    private void FixedUpdate()
    {
        if (!isHiding) // Only allow player to move if they are not hiding in the cardboard box
        {
            Movement();
        }
    }

    private void CheckCursor()
    {
        Vector3 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
        Vector3 characterPos = transform.position;
        if (mousePos.x > characterPos.x)
        {
            this.transform.rotation = new Quaternion(0, 0, 0, 0);
        }
        else if (mousePos.x < characterPos.x)
        {
            this.transform.rotation = new Quaternion(0, 180, 0, 0);
        }
    }

    private void Movement()
    {
        // TODO : Implementasi movement player
        rb2d.velocity = new Vector2(moveDirection.x * moveSpeed, moveDirection.y * moveSpeed);
    }

    private void ProcessInputs()
    {
        float moveX = Input.GetAxisRaw("Horizontal");
        float moveY = Input.GetAxisRaw("Vertical");
        moveDirection = new Vector2(moveX, moveY);

        if (Input.GetMouseButtonDown(0))
        {
            Shoot();
        }
    }

    private void Shoot()
    {
        Vector3 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
        Vector3 gunPointPos = gunPoint.transform.position;
        Vector3 direction = (mousePos - gunPointPos).normalized;

        GameObject bullet = Instantiate(bulletPrefab, gunPointPos, Quaternion.identity);
        bullet.GetComponent<Bullet>().Init(direction);
    }
}

EnemyController 脚本:

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

public class EnemyController : MonoBehaviour
{
    public Transform player;
    public float moveSpeed = 5f;
    public float detectionRadius = 5f;
    public int maxHealth = 1;
    private int currentHealth;
    private Rigidbody2D rb2d;
    private Vector2 movement;

    private void Start()
    {
        rb2d = this.GetComponent<Rigidbody2D>();
        currentHealth = maxHealth;
    }

    private void Update()
    {
        float distanceToPlayer = Vector2.Distance(transform.position, player.position);

        if (player != null && distanceToPlayer <= detectionRadius && !player.GetComponent<PlayerController>().isHiding)
        {
            Vector3 direction = player.position - transform.position;
            float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
            rb2d.rotation = angle;
            direction.Normalize();
            movement = direction;
        }
        else
        {
            movement = Vector2.zero;
        }
    }

    void FixedUpdate()
    {
        moveCharacter(movement);
    }

    private void moveCharacter(Vector2 direction)
    {
        rb2d.MovePosition((Vector2)transform.position + (direction * moveSpeed * Time.deltaTime));
    }

    public void DestroyEnemy()
    {
        Destroy(gameObject);
    }
    }


子弹脚本:

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

public class Bullet : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField] private float speed;
    [SerializeField] private Vector3 direction;
    public void Init(Vector3 direction)
    {
        this.direction = direction;
        this.transform.SetParent(null);
        transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg);
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.position += transform.right * speed * Time.deltaTime;
    }
    // TODO : Implementasi behaviour bullet jika mengenai wall atau enemy

    private void OnTriggerEnter2D(Collider2D other)
    {   
        switch(other.gameObject.tag)
        {
            case "Wall":
            Destroy(gameObject);
            break;
            case "Enemy":
            Destroy(gameObject);
            other.gameObject.GetComponent<EnemyController>().DestroyEnemy();
            break;
        }
    }
}

我试过修改我的脚本,我试过检查纸板盒游戏对象中是否有任何缺失的组件,但无济于事。虽然我在 Unity 部分可能是错误的,因为我相当确定脚本不是这里的问题,但也可能是错误的。

感谢我能得到的所有帮助,感谢您阅读到这里

c# unity3d game-development
© www.soinside.com 2019 - 2024. All rights reserved.