当前位置: 首页 > article >正文

【unity小技巧】Unity 和 C# 中使用多种方式进行不同的变量类型转换

文章目录

      • 1. **隐式转换(Implicit Casting)**
      • 2. **显式转换(Explicit Casting)**
      • 3. **类型转换(`as` 和 `is`)**
        • `as` 关键字
        • `is` 关键字
      • 4. **`Convert` 类**
      • 5. **`Parse` 和 `TryParse`**
        • `Parse`
        • `TryParse`
      • 6. **自定义类型转换**
        • 隐式转换
        • 显式转换
      • 7. **Unity 特定类型转换**
        • `Vector3` 和 `Vector2` 之间的转换
        • `GameObject` 和 `Transform` 之间的转换
      • 总结
  • 完结

在 Unity 和 C# 中,不同类型的变量转换有多种方式,具体取决于类型之间的关系。以下是一些常见的类型转换方式:

1. 隐式转换(Implicit Casting)

当两种类型之间的转换是安全的,编译器会自动进行转换。例如,从 intfloat,因为 float 类型能够容纳 int 类型的所有值。

int intValue = 10;
float floatValue = intValue;  // 隐式转换:int 到 float

2. 显式转换(Explicit Casting)

如果类型之间的转换可能会丢失数据,或者不兼容,编译器会要求你进行显式转换。显式转换使用强制类型转换((类型))来进行。

float floatValue = 10.5f;
int intValue = (int)floatValue;  // 显式转换:float 到 int(会丢失小数部分)

3. 类型转换(asis

在 C# 中,有两种常用的类型转换方式:asis

as 关键字

as 用于将一个对象尝试转换为另一个类型。如果转换成功,它会返回目标类型的对象,否则返回 null

object obj = "Hello, world!";
string str = obj as string;  // 如果 obj 是 string 类型,则转换成功,否则 str 为 null
is 关键字

is 用于检查对象是否可以转换为目标类型。如果是,则返回 true,否则返回 false

object obj = "Hello, world!";
if (obj is string)
{
    string str = (string)obj;  // 确保类型为 string 后可以安全转换
}

4. Convert

对于一些常见类型之间的转换(比如从 intdouble,从 stringint),C# 提供了 Convert 类。它支持从一种类型转换为另一种类型。

string numberString = "123";
int number = Convert.ToInt32(numberString);  // 从 string 到 int

float floatNumber = Convert.ToSingle(numberString);  // 从 string 到 float

Convert 进行的转换通常比显式转换更安全,能够处理更多的类型转换,比如将 null 转换为零等。

5. ParseTryParse

对于一些类型(比如字符串到数字),可以使用 ParseTryParse 方法进行转换:

Parse

Parse 用于将字符串转换为目标类型,成功时返回目标类型,失败时抛出异常。

string str = "123";
int intValue = int.Parse(str);  // 如果字符串不是有效的数字,则抛出异常
TryParse

TryParse 会尝试将字符串转换为目标类型。如果转换失败,返回 false,而不会抛出异常。

string str = "123";
if (int.TryParse(str, out int intValue))
{
    // 成功转换
    Debug.Log(intValue);
}
else
{
    // 转换失败
    Debug.LogError("转换失败");
}

6. 自定义类型转换

如果你有自己的类或结构体,可以通过重载 implicitexplicit 运算符来定义如何将自定义类型转换为其他类型。

隐式转换
public class MyClass
{
    public int Value;
    
    public static implicit operator int(MyClass obj)
    {
        return obj.Value;  // 自动将 MyClass 转换为 int
    }
}

MyClass myObj = new MyClass() { Value = 10 };
int value = myObj;  // 隐式转换:MyClass 转换为 int
显式转换
public class MyClass
{
    public int Value;
    
    public static explicit operator float(MyClass obj)
    {
        return (float)obj.Value;  // 显式将 MyClass 转换为 float
    }
}

MyClass myObj = new MyClass() { Value = 10 };
float value = (float)myObj;  // 显式转换:MyClass 转换为 float

7. Unity 特定类型转换

Unity 中经常会遇到一些与 Unity 引擎相关的类型转换,特别是在 Vector3TransformGameObject 等类型之间转换时。以下是一些常见的 Unity 特定类型转换:

Vector3Vector2 之间的转换

如果你需要将 Vector3 转换为 Vector2(忽略 z 轴),或者将 Vector2 转换为 Vector3,可以这样做:

Vector3 vector3 = new Vector3(1, 2, 3);
Vector2 vector2 = new Vector2(vector3.x, vector3.y);  // 只取 x, y

Vector2 vector2b = new Vector2(4, 5);
Vector3 vector3b = new Vector3(vector2b.x, vector2b.y, 0);  // 默认为 z = 0
GameObjectTransform 之间的转换

在 Unity 中,每个 GameObject 都有一个 Transform 组件。你可以通过以下方式访问它:

GameObject myObject = new GameObject();
Transform transform = myObject.transform;  // 获取 GameObject 的 Transform 组件

// 反向操作:通过 Transform 获取 GameObject
GameObject myObject2 = transform.gameObject;

总结

  • 隐式转换:适用于可以安全转换的类型。
  • 显式转换:当转换可能丢失数据时,需要使用强制转换。
  • asis:用于类型检查和安全转换。
  • Convert:用于类型之间的常见转换。
  • ParseTryParse:用于字符串与数字类型之间的转换。
  • 自定义类型转换:可以通过运算符重载自定义类型之间的转换。
  • Unity 特定转换:特别针对 Unity 中常见的类型(如 Vector3TransformGameObject)的转换。

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.kler.cn/a/407498.html

相关文章:

  • Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法
  • uiautomator案例
  • 软件测试——性能测试概念篇
  • LeetCode 145.二叉树的后序遍历
  • 自监督学习:从概念到应用的全面解析
  • ssm面向品牌会员的在线商城小程序
  • 【爬虫】Firecrawl对京东热卖网信息爬取(仅供学习)
  • 动态规划算法--01背包问题详细讲解步骤
  • Oracle热备过程中对数据库崩溃的处理方法
  • Python爬虫能处理动态加载的内容吗?
  • C语言的文件函数
  • 如何在 Elasticsearch 中配置 SSL / TLS ?
  • win10局域网加密共享设置
  • 数据结构之——红黑树
  • Hive基础笔记
  • 【数据结构-队列】力扣232. 用栈实现队列
  • 洛谷 P1722 矩阵 II C语言 记忆化搜索
  • 对比学习——moco
  • Android 工厂设计模式的使用:咖啡机,可以做拿铁,可以做美式等等。
  • SCTransNet验证测试
  • 解决报错:rror: error:0308010C:digital envelope routines::unsupported
  • 利用软件实现发票的批量查验,并自动截图保存 91发票查验助手
  • 【C++】关于指针Free和链表循环释放的问题
  • websocket消息的实现
  • 【公开笔记】小白学习vue3完整版
  • 智能体来了:构建用于具有结构化输出的内容审核的智能 AI Agent 智能体