实现 UI 元素后玩家随机改变位置

所以我一直在关注在Unity中制作2D游戏的教程(我是一个完全的新手,这是我第一次接触编程),我想给游戏添加一个功能(粗体)。 “心脏系统”我添加的工作正常(空心的数量等于玩家受到的伤害),但它导致我的玩家以一种奇怪的方式改变了他的位置。您可以看到,设置了边界(maxHeight = 3,2,minHeight = -3,2),以及他的运动值(Yincrement = 3.2),但是,在按向上或向下箭头键后,他似乎发生了变化Y 位置大约 4.67。 这是播放器脚本:


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.SceneManagement;

using UnityEngine.UI;


public class Player : MonoBehaviour

{

    private Vector2 targetPos;

    public float Yincrement;


    public float speed;

    public float maxHeight;

    public float minHeigth;


    public int health = 3;

    public int numOfHearts;


    public Image[] hearts;

    public Sprite heartFull;

    public Sprite heartEmpty;


    public GameObject effect;


    public Image healthDisplay;


    private void Update()

    {

        for (int i = 0; i < hearts.Length; i++)

        {

            if (i < health)

            {

                hearts[i].sprite = heartFull;

            }

            else

            {

                hearts[i].sprite = heartEmpty;


                if (i < numOfHearts)

                {

                    hearts[i].enabled = true;

                }

                else

                {

                    hearts[i].enabled = false;

                }

            }


            if (health <= 0)

            {

                SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

            }

        }

    }

}


凤凰求蛊
浏览 111回答 1
1回答

森林海

主要问题主要问题是您的for 循环。它只能用于更新 UI - 不能多次调用您的移动和场景重新加载!您应该提前关闭for循环。for (int i = 0; i < hearts.Length; i++){    // you can also reduce these to single lines    hearts[i].enabled = i < numOfHearts;    if(i < numOfHearts) hearts[i].sprite = i < health ? heartFull : heartEmpty;    } // <-- ALREADY CLOSE IT HEREif(health <= 0) ......位置夹紧你对位置的夹紧极不安全!想象一下当前位置是 3.1 仍然是 < maxHeight,因此您添加 Yincrement 一次,结果是最大可能高度 < /span>6.3!这不是你想要的。您应该直接钳位targetPosition,而不是钳位当前transform.position。例如,您可以使用 Mathf.Clamp 确保 targetPos.y 始终保持在给定范围内。此外,由于这两种情况都执行非常相似的操作,因此我会使用简单的 int 变量来设置方向,将其减少为仅一次移动:...transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);var move = 0;var targetPosY = targePos.y;if (Input.GetKeyDown(KeyCode.UpArrow) && targetPosY < maxHeight){    move = 1;}else if (Input.GetKeyDown(KeyCode.DownArrow) && targetPosY > minHeigth){    move = -1;}// Handle the movement according to the direction// in one single code block for both directionsif(move != 0){    Instantiate(effect, transform.position, Quaternion.identity);    // increase/decrease the targetPosY according to the move direction    targetPosY += move * Yincrement;    // Now make sure it is within the range    targetPosY = Mathf.Clamp(targetPosY, minHeight, maxHeight);    // finally assign the new target position    targetPos = new Vector2(transform.position.x, targetPosY);}
打开App,查看更多内容
随时随地看视频慕课网APP