【Unity3D】用InputField做一个简易UI,为GameObject的高度y赋值

一些废话

我是一只总是和Unity有不解之缘的Unity小菜鸡。一直想实现一个在Unity中输入参数,改变物体基本数值的功能,这个功能想想就很简单,但每次都会因为各种bug没解决就放弃了。今天问了新必应三个问题,我抱着试一试的心态试了一试,终于成功了。


之前卡过的bug

InputField更新了类名,引用后无法拖拽

这个问题可以看我之前的帖子:
【Unity3D】在inspector面板中无法为Text、InputField等组件拖拽赋值解决方案

单独对GameObject的Transform.position中的某一坐标赋值

在这里插入图片描述
新必应已经回答得很清楚了:

要获取GameObject的Position,你可以使用Transform.position属性,它是一个Vector3类型的值,包含了x,y,z三个分量。例如:

//获取GameObject的Transform组件
Transform transform = gameObject.GetComponent<Transform>();
//获取GameObject的Position
Vector3 position = transform.position;

要给GameObject的Position的y赋新值,你可以修改position变量的y分量,然后再把position赋值给transform.position。例如:

//给position的y赋新值
position.y = 10f;
//把position赋值给transform.position
transform.position = position;

float.Parse(),格式报错FormatException

在这里插入图片描述

 public TMP_InputField inputField;
 public TMP_Text inputText;
...
height = float.Parse(inputText.text);

报错为FormatException: Input string was not in a correct format.

在这里插入图片描述

回答如下:

  • float.Parse()函数用于将一个字符串转换为一个浮点数,但是如果字符串的格式不符合浮点数的规范,就会抛出FormatException异常。例如,如果字符串包含非数字字符,或者小数点后面有多余的零,就会导致这个错误。
  • 为了避免这个错误,你可以使用float.TryParse()函数来尝试转换一个字符串为浮点数,并返回一个布尔值表示是否成功。如果成功,你可以使用out参数来获取转换后的浮点数;如果失败,你可以给出相应的提示或处理逻辑。
  • 另外,你也需要注意你从哪里获取字符串的值。如果你是从Unity的InputField组件中获取文本值,那么你不应该直接访问它的子对象Text组件中的text属性,因为那是用于显示给用户看的,并可能包含一些隐藏字符。你应该访问InputField组件本身的text属性来获取用户输入的值。

改为以下即可,的确是因为隐藏字符引起的。

public TMP_InputField inputField;
public TMP_Text inputText;
...
height = float.Parse(inputField.text);

点击按钮,值只改变了一瞬间又回到原来状态

具体的原因还没有搞懂,但我后来将函数放在了Update()中,暂时效果上差不多(待优化)。

在这里插入图片描述


完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System;

public class FPSHeightController : MonoBehaviour
{
    
    
    public TMP_InputField inputField;
    public TMP_Text inputText;
    public GameObject fpsc;
    public float height = 1.6f;

    // Start is called before the first frame update
    void Start()
    {
    
    
    }   

    // Update is called once per frame
    void Update()
    {
    
    
        FpsControll();
    }

    public void FpsControll(){
    
    
        height = float.Parse(inputField.text); 
        
        //获取GameObject的Transform组件
        Transform transform = fpsc.GetComponent<Transform>();
        //获取GameObject的Position
        Vector3 position = transform.position;

        //给position的y赋新值
        position.y = height;
        //把position赋值给transform.position
        transform.position = position;
    }
}

在Hierarchy中新建GameObject,挂载脚本,该拖的就拖到对应的位置即可。


后记

费了一小番功夫安插件、等邮件、删cookie,兴奋地把chatGPT分享给室友,大概就像三十年前同样费力连上网线,刚刚接触到互联网新大陆的中国大学生吧…

猜你喜欢

转载自blog.csdn.net/weixin_41932970/article/details/129456397