为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
凤凰求蛊 2023-12-17 10:42:19
所以我一直在关注在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);            }        }    }}
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

主要问题

主要问题是您的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 HERE


if(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 directions

if(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);

}


查看完整回答
反对 回复 2023-12-17
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信