Unity通过组件名称字符串添加脚本

简介: 通过Type.GetType(string typeName)来得到字符串对应的Type。 Type.GetType(typeName)能获取到自定义类的类型,但是获取Unity的组件不行。例如Type.GetType(“Rigidbody”)值为null,其实是少了程序集。string qualifiedName = typeof(Rigidbody).AssemblyQualifiedName;ty获取Unity的组件程序集全名,再通过Type.GetType()得到的就不为null了。

一、说明(AddComponent(string)已被官方弃用

1. 通过Type.GetType(string typeName)来得到字符串对应的Type。

public Component AddComponent(Type componentType)

image.gif

2. Type.GetType(typeName)能获取到自定义类的类型,但是获取Unity的组件不行。

例如Type.GetType(“Rigidbody”)值为null,其实是少了程序集。

所以如下正确:

Type type = Type.GetType("UnityEngine.Rigidbody, UnityEngine.PhysicsModule")

image.gif

3. 获取Unity的组件程序集全名,再通过Type.GetType()得到的就不为null了。

string qualifiedName = typeof(Rigidbody).AssemblyQualifiedName;
type = Type.GetType(qualifiedName);

image.gif

二:C#代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
    string coms = "BoxCollider";
    void OnValidate()
    {
        transform.AddComponentToString(coms);
    }
}
public static class ExtensionMethod
{
    public static Component AddComponentToString(this Transform transform,string ComponentName)
    {
        string qualifiedName;
        Dictionary<string, string> ComponentQualifiedName = new Dictionary<string, string>();
        //获取Unity的组件的全名
        qualifiedName = typeof(BoxCollider).AssemblyQualifiedName;
        ComponentQualifiedName.Add("BoxCollider", qualifiedName);
        qualifiedName = typeof(Rigidbody).AssemblyQualifiedName;
        ComponentQualifiedName.Add("Rigidbody", qualifiedName);
        //....需要添加Unity的组件自行再加
        Type type = null;
        Component component = transform.GetComponent(ComponentName);
        if (component == null)
        {
            if (ComponentQualifiedName.ContainsKey(ComponentName))
            {
                type = Type.GetType(ComponentQualifiedName[ComponentName]);
                component = transform.gameObject.AddComponent(type);
            }
            else
            {
                type = Type.GetType(ComponentName);
                component = transform.gameObject.AddComponent(type);
            }
        }
        return component;
    }
}

image.gif

ExtensionMethod是一个扩展类,我将它扩展到Transform中,后续可以直接调用transform.AddComponentToString(string s);

如还有需要添加Unity的组件,还需要自行添加到ComponentQualifiedName中。

相关文章
|
6月前
|
存储 人工智能 Java
Unity优化——脚本优化策略4
Unity优化——脚本优化策略4
111 0
|
2月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
180 3
|
3月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
77 0
|
5月前
|
图形学
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件
197 0
|
5月前
|
人工智能 图形学
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
49 0
|
5月前
|
人工智能 定位技术 图形学
【Unity小技巧】一个脚本实现控制3D远程/近战敌人AI
【Unity小技巧】一个脚本实现控制3D远程/近战敌人AI
50 0
|
5月前
|
自然语言处理 图形学
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
71 0
|
5月前
|
开发工具 图形学
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
323 0
|
5月前
|
程序员 图形学 Android开发
Unity脚本生命周期
Unity脚本生命周期