`
tank2308635
  • 浏览: 191690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】 C#写unity3d的脚本需要注意

 
阅读更多

转载自 19920105

 

Writing Scripts in C#
   使用C#写脚本

Apart from syntax, there are some differences when writing scripts in C# or Boo. Most notable are: 
除了语法外,使用C#或Boo会有一些差别,最明显的是:

1. Inherit from MonoBehaviour
继承之MonoBehaviour类

All behaviour scripts must inherit from MonoBehaviour (directly or indirectly). This happens automatically in Javascript, but must be explicitly explicitly inside C# or Boo scripts. If you create your script inside Unity through the Asset -> Create -> C Sharp/Boo Script menu, the created template will already contain the necessary definition. 
所有的行为脚本代码必须继承之MonoBehaviour类(直接或间接)。如果使用的是javascript的话会自动(隐性)的继承,如果使用的是 C#或Boo就必须明确地指定其继承于MonoBehaviour。如果你是在u3d中通过“Asset->Create->C Sharp Script/Boo Script”来创建了脚本代码文件的话,u3d的脚本创建模板将会提前将相关继承语句定义在脚本代码文件中。

public class NewBehaviourScript : MonoBehaviour {...}     // C#

class NewBehaviourScript (MonoBehaviour): ...    # Boo


2. Use the Awake or Start function to do initialisation.
使用Awake或Start方法进行初始化。

What you would put outside any functions in Javascript, you put inside Awake or Start function in C# or Boo. 
,你(需要)在C#或Boo在使用Awake或Start方法。

The difference between Awake and Start is that Awake is run when a scene is loaded and Start is called just before the first call to an Update or a FixedUpdate function. All Awake functions are called before any Start functions are called. 
Awake和Start之间的区别在于:Awake是当一个场景调入过程完成后会自动运行,而Start则是会在Update或FixedUpdate方法被第一次调用之前被运行。所有的Awake方法运行的优先级会高于任意的Start方法。



3. The class name must match the file name.
(文件中)主类名必须与文件名相同。

In Javascript, the class name is implicitly set to the file name of the script (minus the file extension). This must be done manually in C# and Boo.
在javascript脚本文件中,u3d虽然没有明确地定义主类,但事实上,u3d已经隐性地自动定义了主类,并将类名设置为等于脚本文件名(不包括扩展名)。
如果使用的是C#a或Boo脚本,那就必须得手动的将主类名设置为与文件同名。

4. Coroutines have a different syntax in C#.
使用C#实现协同,在语法上会有一处不同。

Coroutines have to have a return type of IEnumerator and you yield using yield return ... ; instead of just yield 
(U3D中的)协同会(同时)用一个属于IEnumerator接口类型(枚举)的返回值和你使用的yield 返回值...;来替代yield......;
如下面代码:

using System.Collections;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine
IEnumerator SomeCoroutine () {
// Wait for one frame
yield return 0;

// Wait for two seconds
yield return new WaitForSeconds (2);
}
}

5. Don't use namespaces.
不要使用命名空间。
Unity doesn't support placing your scripts inside of a namespace at the moment. This requirement will be removed in a future version. 
U3D目前不支持你在脚本中使用命名空间,这个需求会在未来的版本中实现。


6. Only member variables are serialized and are shown in the Inspector.
只有(public公有的)成员变量是可以在U3D程序的Inspector栏中会被以序列形式显示出来

Private and protected member variables are shown only in Expert Mode. Properties are not serialized or shown in the inspector. 
私有类型(private)和成员类型(protected)变量只能在专家模式(Expert Mode)下可见,(而且)属性(Properties)

7. Avoid using the constructor.
避免使用构造函数

Never initialize any values in the constructor. Instead use Awake or Start for this purpose. Unity automatically invokes the constructor even when in edit mode. This usually happens directly after compilation of a script, because the constructor needs to be invoked in order to retrieve default values of a script. Not only will the constructor be called at unforeseen times, it might also be called for prefabs or inactive game objects. 
不要通过构造函数来初始化变量。这些工作可以使用第2条中的Awake方法和Start方法来替代(换句话来说就是在u3d中,Awake方法和 Start方法是每个脚本文件类中默认的构造函数)。U3D甚至可以在标准编辑模式下就调用它们。它们通常是直接汇编在脚本中,因为构造函数需要检索默认 脚本变量用于引用。(u3d)在任意的时候不光可以调用构造函数,还可能会调用预设(物体)或未被唤醒的游戏物体。

In the case of eg. a singleton pattern using the constructor this can have severe consequences and lead to seemingly random null reference exceptions. 
实例化(C#脚本文件)时,单脚本文件状态下使用(自定义的)构造函数(可能)会导致严重的后果,并且会产生引用为空的异常。

So if you want to implement eg. a singleton pattern do not use the the constructor, instead use Awake. Actually there is no reason why you should ever have any code in a constructor for a class that inherits from MonoBehaviour.

 

所以,如果你实例化C#脚本文件(即运行C#脚本文件。这是c#程序运行的基本方式,详细内容可以从C#专门的教材中了解),单脚文件不要使用(自定义 的)的构造函数,直接使用Awake方法替代即可,实在没有理由为一个继承之MonoBehaviour的(文件)类写任何的(构造函数)代码。

分享到:
评论

相关推荐

    Unity3d脚本编程 使用C#语言开发跨平台游戏

    Unity3d脚本编程 使用C#语言开发跨平台游戏,适用于新手,本书全面系统地介绍了基于C#的Unity 3D跨平台开发,涉及Unity 3D 跨平台原理分析、Unity 3D 和Mono 的结合,以及在游戏脚本编程中使用C#语言

    Unity 3D脚本编程-使用C#语言开发跨平台游戏

    Unity 3D脚本编程-使用C#语言开发跨平台游戏

    Unity 3D脚本编程 使用C#语言开发跨平台游戏

    Unity 3D脚本编程 使用C#语言开发跨平台游戏 陈嘉栋 著 目录 第1 章 Hello Unity 3D 1 第2 章 Mono 所搭建的脚本核心基础22 第3 章 Unity 3D 脚本语言的类型系统58 第4 章 Unity 3D 中常用的数据结构99 第5 章 在...

    使用C#写u3d的脚本需要注意的问题

    在使用C#编写Unity3D脚本时,需要注意一些关键的问题,以便高效地开发和避免常见的错误。以下是一些编写Unity3D脚本时的重要知识点。 1. Unity3D项目结构理解:在开始编写C#脚本之前,开发者应熟悉Unity3D的项目...

    Unity3D C#脚本中文教程

    ### Unity3D C#脚本中文教程知识点梳理 #### 一、脚本概览 **Unity内部脚本机制**:Unity中的脚本是通过将自定义脚本对象附加到游戏物体上来实现其功能的。这些脚本对象包含了不同的函数,它们会在特定事件触发时...

    Unity 3D脚本编程 使用C#语言开发跨平台游戏 ,陈嘉栋著

    《Unity 3D脚本编程:使用C#语言开发跨平台游戏》这本书是陈嘉栋先生的力作,专门探讨了如何运用C#语言在Unity 3D引擎上进行高效的游戏开发,尤其强调了跨平台的实现。Unity 3D是一款强大的游戏开发工具,其支持C#...

    Unity3d脚本大全

    在这个“Unity3d脚本大全”中,包含了多种类型的脚本,既包括JavaScript(Unity中的js是UnityScript,已被弃用),也包括现在常用的C#语言。这些脚本涵盖了Unity3D开发中的许多关键知识点,让我们来详细探讨一下。 ...

    unity3d 脚本大全

    《Unity3D脚本大全》 Unity3D是一款强大的跨平台游戏开发引擎,它以其高效、易用和灵活性深受开发者喜爱。在Unity3D中,脚本是控制游戏逻辑、实现交互性和动态行为的关键工具。本资料包包含了多个与Unity3D脚本相关...

    Unity3D的C#脚本

    【Unity3D的C#脚本】是游戏开发中常用的一种技术,特别是在Unity3D引擎中,C#作为主要的编程语言之一,被广大开发者所采用。Unity3D提供了JavaScript、C#和Boo三种脚本语言选项,但C#由于其强大的面向对象特性和与...

    unity3D C#脚本中文教程

    首先,Unity3D脚本主要通过将自定义的脚本对象附加到游戏对象上来实现。脚本对象内部包含了一系列的函数,这些函数在特定事件发生时被调用。例如,Update函数在每一帧渲染之前被调用,是实现游戏逻辑的主要场所。而...

    Unity 3D脚本编程 使用C#语言开发跨平台游戏_PDF

    Unity 3D是一款强大的跨平台游戏开发引擎,广泛应用于创建2D、3D游戏...这份"Unity 3D脚本编程 使用C#语言开发跨平台游戏"的PDF文档,无疑会是学习这一技能的重要参考资料,帮助开发者快速掌握Unity 3D的游戏开发技术。

    Unity3D脚本中文教程

    这个“Unity3D脚本中文教程”旨在帮助中文学习者掌握Unity3D中的脚本编写技术,更好地理解和应用Unity3D API。 教程可能包含以下几个关键知识点: 1. **Unity基础知识**:首先,教程可能会介绍Unity的工作环境,...

    Unity 3D脚本编程-使用C#语言开发跨平台游戏1

    本教程的PDF文件《Unity 3D脚本编程 使用C#语言开发跨平台游戏》将详细讲解以上内容,并可能涵盖更高级的主题,如图形渲染、粒子系统、动画系统等。配合实践,你将能够创建出引人入胜的跨平台游戏。记得随时查阅和...

    C#利用Unity3D开发应用软件

    首先,Unity3D的C#脚本是其核心功能之一。开发者可以创建C#脚本来控制游戏对象的行为,例如角色的移动、动画的播放、物理系统的交互等。C#的类结构使得组织代码变得容易,可以创建自定义的游戏对象和系统,从而实现...

    unity3d脚本教程

    在这个"Unity3D脚本教程808个教程"中,我们将深入探讨Unity3D的脚本系统和相关知识。 1. **C#基础**:在Unity中,脚本主要使用C#编写。学习C#的基础语法,包括变量、数据类型、控制结构(如if语句、for循环)、函数...

    C#-使用C#开发的Unity3D客户端.zip

    Unity3D的MonoBehavior框架允许开发者通过C#脚本来控制游戏对象的行为,这些脚本会在Unity的时间轴上按照特定的生命周期方法执行,如`Start()`, `Update()`, 和 `LateUpdate()`。 在Unity3D中,C#脚本主要负责以下...

    Unity3D脚本:随时间改变光照强度1

    要实现随时间改变光照强度的效果,我们需要使用 Unity3D 的脚本语言 C#。在上面的代码中,我们可以看到使用的方法是使用 Mathf.Cos 函数来生成一个余弦波,然后将其作为光照强度的值。这个方法可以生成一个自然的、...

    Unity3D脚本:如何激活另一个物体下脚本2

    在Unity3D游戏开发中,使用C#脚本来控制游戏对象的行为是至关重要的。当我们需要在运行时激活或禁用另一个游戏对象上的脚本时,这通常涉及到对组件的访问和状态管理。本文将深入探讨如何通过脚本实现这一功能。 ...

    Unity3D脚本:如何调用更改其他脚本中的变量2

    在Unity3D游戏开发中,使用C#编写脚本是常见的做法。在多个脚本之间共享数据或控制其他脚本中的变量是常见的需求。本文将详细介绍如何在Unity3D中调用并更改其他脚本中的变量,以实现不同组件间的交互。 首先,我们...

Global site tag (gtag.js) - Google Analytics