万胜 发表于 2021-2-12 20:34

初学unity,想问下为什么这里不用new初始化对象,就可以直接调用该类方法?

初学unity,想问下为什么这里不用new初始化对象,就可以直接调用该类方法?

侬去斯 发表于 2021-2-12 20:38

好家伙,下面的都挺暴躁的。
new关键字常用于用于创建一个新的实例,在animation这个类里也可以。而阅读该代码后发现,anim变量通过this.anim=anim字段来获取了值,而该函数的参数必然是一个已经实例化的animation类,所以无需new新建。
简单说,你现在需要用某个东西(比如橡皮),用来做一件事(比如擦掉痕迹)。那么你是觉得你需要买一个新的(new新建),还是直接从铅笔盒拿出来(通过函数调用来引用现有类)使用呢。
……写完了才发现并没有写的更简单,就这么看吧意思意思。

心随674 发表于 2021-2-12 20:46

其他的回答都没明白你的痛点,为什么你会有这个问题,但我懂你,我真的懂你,因为我刚开始学Unity的时候也有这种问题,为什么实例不用new直接就能用?为什么脚本里面Update、Start等方法,没有直接调用,却能执行?
原因就在于,我们的编程思维还没有适应Unity的设计。最开始我做游戏开发的时候,是用的Python的pygame引擎,几乎要从0开始写程序,用到什么内容,就必须先创建(new)出来,再在自己写的死循环里去Update更新每一帧的画面。这是符合我们一开始学程序时的编程思维的,一步一步执行,每个实例我们知道怎么来的,每个步骤都是按照我们的思路来的。
因此,不适应Unity的原因是,Unity给我们封装得太好了,游戏的流程、各种组件、各种框架都已经搭建好,我们只要拖拽一下,稍微这点代码,就完成了原本要写很多行的功能。所以,你从自己的脚本来看,明明没有new出来啊,但其实Unity内部在游戏开始阶段已经new出来过了,并且会自动赋值,所以你用的是一个实例,而不是一个还没new出来的变量名。包括继承了MonoBehaviour的脚本,Unity内部会通过反射来调用内部的Update等方法,不用每一帧都要我们自己手动去调用一次Update,再tick一下。
所以,初学者学Unity时的疑问,很多时候是不懂Unity的机制,包括为什么拖拽一下就能对暴露出的字段赋值呢?因为Unity会给对应的资源生成meta文件,内容包含了引用、初始化的数值、ID等等,这些都是Unity给我们做好了的工作,让我们的游戏开发工作量大大减少,这是一个商业化引擎应该要具有的。
所以我们要跳出原本的思维惯性,理解和适应Unity的机制,也就没那么多疑问了

123456809 发表于 2021-2-12 20:50

构造函数里,不是给this.anim赋值了吗。
this.anim = anim;

我的苦恼冉 发表于 2021-2-12 20:53

我以为是mono。。没想到就是单纯的c#。。。


emmm,这不就是类的实例变量,已经在构造函数中赋值了么。


建议先看下c#相关教程

侬去斯 发表于 2021-2-12 21:01

这个anim不是你外面传过来的么?

侬去斯 发表于 2021-2-12 21:10

没学过构造函数?没看到传进来的anim?

123456819 发表于 2021-2-12 21:11

上面那句this. anim= anim看见了吗,赋值了直接用这不是很正常吗?
自学不是瞎学,老老实实找本书把c#基础学了谢谢。

掌舵的鱼1987 发表于 2021-2-12 21:11

你自己写一个类,然后你学它这样调用试试,然后你就会发现你陷入了一个循环,也就是无论如何,this.anim=anim当中后面的anim始终绕不开需要实例化。
这不是unity的问题,是基本功问题。

杨柳657 发表于 2021-2-12 21:13

说明你对编程基础还不是很理解啊,你这不是已经在构造函数里赋过值了么。
页: [1] 2
查看完整版本: 初学unity,想问下为什么这里不用new初始化对象,就可以直接调用该类方法?