c# - 播放器在实现 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);
}
transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
if (Input.GetKeyDown(KeyCode.UpArrow) && transform.position.y < maxHeight)
{
Instantiate(effect, transform.position, Quaternion.identity);
targetPos = new Vector2(transform.position.x, transform.position.y + Yincrement);
}
else if (Input.GetKeyDown(KeyCode.DownArrow) && transform.position.y > minHeigth)
{
Instantiate(effect, transform.position, Quaternion.identity);
targetPos = new Vector2(transform.position.x, transform.position.y - Yincrement);
}
}
}
}
解决方案
您能否详细说明您的游戏是关于什么的,以及您在脚本的每个部分中尝试做什么。那我也许能帮你。此外,如果这是您第一次接触编程,这是一种进阶方式。从更简单的东西开始,在继续之前先了解编程的基本概念。这是一个很好的教程系列,可以为绝对初学者学习 c# 编程。
https://www.youtube.com/watch?v=pSiIHe2uZ2w
我不确定您要做什么,但为什么您的运动控制在您的 for 循环中。这可能就是你搞砸的原因。尝试从 for 循环中删除所有这些代码。
transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
if (Input.GetKeyDown(KeyCode.UpArrow) && transform.position.y < maxHeight)
{
Instantiate(effect, transform.position, Quaternion.identity);
targetPos = new Vector2(transform.position.x, transform.position.y + Yincrement);
}
else if (Input.GetKeyDown(KeyCode.DownArrow) && transform.position.y > minHeigth)
{
Instantiate(effect, transform.position, Quaternion.identity);
targetPos = new Vector2(transform.position.x, transform.position.y - Yincrement);
}
此外,此代码应该在您检查玩家是否移动之后。
transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
这是使运动更容易一些的提示。使用 transform.translate 而不是 Vector2.MoveTowards。Transform.translate 接受 3 个浮点数,并通过表示为向量的三个浮点数来改变玩家的位置。
这是一个例子
transform.translate(0,2,0);
这会将玩家的 y 位置更改 2。我认为您的代码应该如下所示。
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);
}
if (Input.GetKeyDown(KeyCode.UpArrow) && transform.position.y < maxHeight)
{
transform.Translate(0,Yincrement,0)
}
else if (Input.GetKeyDown(KeyCode.DownArrow) && transform.position.y > minHeigth)
{
Instantiate(effect, transform.position, Quaternion.identity);
transform.Translate(0,Yincrement,0);
}
}
}
收到您的回复后,我可能会提供帮助,但不能保证,因为我也只有大约一年的经验。
推荐阅读
- c# - 获取通过 Azure AD 身份验证的 asp.net 核心 Web 应用程序的用户信息(高级)
- django - 对将应用程序添加到 INSTALLED_APPS 感到困惑
- reactjs - 有状态和无状态的反应组件
- python - 如何使用 django-redis 和 mockredis 在 django 中模拟 redis
- sql - 我应该将“消息”分成 2 个表吗?
- lodash - Lodash 在数组中查找数组
- r - 如何拟合 R 中频率和强度的正态分布?
- ios - websocket(starscream)中ping和pong的用法是什么
- c# - 在 C# 窗体中调整文本框和图片框的大小
- java - 我如何从用户那里获取图像?api使用:图像裁剪器,circleimageview