0

0

unity c# 脚本入门

煙雲

煙雲

发布时间:2025-12-27 04:07:22

|

911人浏览过

|

来源于php中文网

原创

Unity脚本需满足文件名类名一致、位于Assets下、继承MonoBehaviour三条件才能挂载;Update适合轻量逻辑但须缓存组件引用;GetComponent返回null主因是组件缺失或时机不当;协程不阻塞主线程,WaitForSeconds受时间缩放影响。

unity c# 脚本入门

Unity C# 脚本不是“学完语法就能用”,而是得立刻知道 Start()Update() 什么时候该写什么、GetComponent() 为什么总返回 null、以及为什么拖了脚本到 GameObject 上却没反应——这些才是卡住新手的真问题。

脚本挂不上?先确认三个硬性条件

Unity 不会自动识别任意 C# 文件。必须同时满足:

  • 文件名和类名**完全一致**(包括大小写),例如文件叫 PlayerController.cs,类必须是 public class PlayerController : MonoBehaviour
  • 脚本必须放在 Assets 文件夹下(不能在 Project SettingsLibrary 里)
  • 脚本里至少继承 MonoBehaviour,且没有编译错误(看 Console 窗口有没有红色报错)

常见现象:拖脚本到 Inspector 却看不到组件——八成是类名/文件名不一致,或脚本在 PluginsEditor 子目录下(那些目录有特殊编译顺序)。

Update() 里写逻辑,但别在里面做耗时操作

Update() 每帧调用一次,适合处理输入、简单位移、状态轮询;但它不是“万能主循环”。容易踩的坑:

  • Update() 里频繁调用 GetComponent()FindGameObjectWithTag() —— 这些是运行时查找,开销大,应缓存到字段
  • 把资源加载(如 Resources.Load())、JSON 解析、路径计算等放进去 —— 会导致帧率骤降
  • 误以为 Update() 是“初始化入口”——实际初始化逻辑应该写在 Start()Awake()

正确做法:

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb; // 缓存引用
void Awake()
{
    rb = GetComponentzuojiankuohaophpcnRigidbodyyoujiankuohaophpcn(); // 一次获取,反复使用
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 5f);
    }
}

}

中小企业网站系统前台源码(SmallBusinessStarterKit)
中小企业网站系统前台源码(SmallBusinessStarterKit)

小型企业入门套件(The Small Business Starter Kit)提供了一个商业宣传网站的完整演示,他适合中小型企业。使用他创建的网站支持自定义模板,具有先进的功能,包括:内容和数据管理的SQL和XML数据源整合。该源码包含C#和VB两个版本,只有前台部分源码,微软官方截止到51aspx发布源码时还没有提供后台代码。小型企业网站入门套件的关键页面包括:产品分类显示新闻发布显示商户认证

下载

GetComponent 返回 null?检查对象生命周期和组件存在性

GetComponent() 返回 null 的原因很具体,不是“没连上”,而是:

  • 目标 GameObject 上**根本没有该组件**(比如想取 AudioSource,但没添加这个组件)
  • 脚本执行时机早于目标组件初始化(例如在 Awake() 里取另一个脚本的字段,而那个脚本的 Awake() 还没跑)
  • 跨 Prefab 实例操作时,用了 transform.Find() 找子物体,但名字拼错或层级变了
  • 用了 GetComponentInParent() 却忘了父物体没挂对应组件

调试建议:加一行日志确认对象是否有效:

var target = GameObject.Find("Enemy");
if (target == null)
{
    Debug.LogError("找不到 Enemy 对象");
    return;
}

var enemyAI = target.GetComponent(); if (enemyAI == null) { Debug.LogError("Enemy 对象上没有 EnemyAI 组件"); }

协程不是线程,WaitForSeconds 不是“暂停整个脚本”

StartCoroutine() 启动的是协程,它和主线程共享上下文,不会阻塞其他逻辑。但新手常误解 yield return new WaitForSeconds(2) 的作用:

  • 它只暂停当前协程,不影响 Update() 或其它协程运行
  • 时间基于 Unity 的时间缩放(Time.timeScale),设为 0 时会卡住 —— 需要用 WaitForSecondsRealtime 替代
  • 协程中不能直接访问未初始化的字段(比如在 Start() 之前就启动协程)

典型用法:延迟触发、分帧加载、渐变效果

IEnumerator FadeOut()
{
    for (float t = 1f; t >= 0; t -= 0.05f)
    {
        renderer.material.color = new Color(1, 1, 1, t);
        yield return null; // 等一帧
    }
}

真正难的不是语法,而是理解 Unity 的执行顺序(Awake → OnEnable → Start → Update → LateUpdate → OnDisable → OnDestroy)和对象依赖关系。哪怕只写一个移动脚本,也要想清楚:位置更新该放哪一帧?输入检测该响应哪个事件?组件引用该在哪一刻拿到?漏掉其中一环,脚本就“看起来没反应”。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

400

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

306

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

69

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

430

2024.03.01

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

454

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

6

2025.12.06

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号