Unity内部脚本初级知识

初级unity开发的重难点知识总结 学习unity开发的一些重难点知识的总结,面试中遇到的一些问题。 阅读详情
脚本概览

这是一个关于Unity内部脚本如何工作的简单概览。

Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:

Update:这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。

FixedUpdate:这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。

在任何函数之外的代码:

在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。

注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。

你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。

 

常用操作

大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:

function Update(){

transform.Rotate(0,5,0);

}

如果你想向前移动一个物体,你应该如下写:

function Update(){

transform.Translate(0,0,2);

}

 

跟踪时间

Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。

所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:

function Update(){

transform.Rotate(0,5*Time.deltaTime,0);

}

移动物体:

function Update(){

transform. Translate (0, ,0,2*Time.deltaTime);

}

如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)

另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。

function Update (){

light.range += 2.0 * Time.deltaTime;

}

当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。

 

访问其他组件

组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。

最常用的组件可以作为简单成员变量访问:

Component             可如下访问

Transform             transform

Rigidbody             rigidbody

Renderer              renderer

Camera                camera (only on camera objects)

Light                 light (only on light objects)

Animation             animation

Collider              collider

…等等。

对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。

任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。

transform.Translate(0,3,0);  //等同于

GetComponent(Transform).Translate(0, 1, 0);

注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。

应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。

function Update(){

otherScript = GetComponent(OtherScript); //这个在同一游戏物体桑找到名为OtherScript的脚本

otherScript.DoSomething(); //并调用它上加的DoSomething

}


向量

Unity使用Vector3类同一表示全体3D向量,3D向量的不同组件可以通过想x,y和z成员变量访问。

var aPosition : Vector3;
aPosition.x = 1;
aPosition.y = 1;
aPosition.z = 1;

你也能够使用Vector3构造函数来同时初始化所有组件。

var aPosition = Vector3(1, 1, 1);
Vector3也定义了一些常用的变量值。
var direction = Vector3.up; // 与 Vector3(0, 1, 0);相同

单个向量上的操作可以使用下面的方式访问:

someVector.Normalize();

使用多个向量的操作可以使用Vector3类的数;

theDistance = Vector3.Distance(oneVector, otherVector);

(注意你必须在函数名之前写Vector3来告诉JavaScript在哪里找到这个函数,这适用于所有类函数)

你也可以使用普通数学操作来操纵向量。

combined = vector1 + vector2;

查看Vector3类文档获取完整操纵和可用属性的列表。

成员变量 & 全局变量

定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问,任何保存在成员变量中的值也可以自动随工程保存。

var memberVariable = 0.0;

上面的变量将在检视面板中显示为名为"Member Variable"的数值属性。

如果你设置变量的类型为一个组件类型(例如Transform, Rigidbody, Collider,任何脚本名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。

var enemy : Transform;

function Update()
{

if ( Vector3.Distance( enemy.position, transform.position ) < 10 );
print("I sense the enemy is near!");

}
}

你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你就像一个实时更新的调试器一样使用私有变量。

private var lastCollider : Collider;

function OnCollisionEnter( collisionInfo : Collision ) {

lastCollider = collisionInfo.other;

}

 

 全局变量

你也可以使用static关键字创建全局变量,这创造了一个全局变量,名为someGlobal

static var someGlobal = 5;// 你可以在脚本内部像普通变量一样访问它

print(someGlobal);// 'TheScriptName.js'中的一个静态变量

someGlobal = 1;

为了从另一个脚本访问它,你需要使用这个脚本的名称加上一个点和全局变量名。

print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;


用C#编写脚本

除了语法,使用C#或者Boo编写脚本还有一些不同。最需要注意的是:

1.从MonoBehaviour继承

所有的行为脚本必须从MonoBehaviour继承(直接或间接)。在Javascript中这自动完成,但是必须在C#或Boo脚本中显示申明。如果你在Unity内部使用Asset -> Create -> C Sharp/Boo Script菜单创建脚本,创建模板已经包含了必需的定义。

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

class NewBehaviourScript (MonoBehaviour): ... # Boo

2.使用Awake或Start函数来初始化

Javascript中放置在函数之外的代码,在C#或Boo中要放置在Awake或Start中。

Awake和Start的不同是Awake在场景被加载时候运行,而Start在第一次调用Update或FixedUpdate函数之前被调用,所有Awake函数在任何Start函数调用之前被调用。

3.类名必须与文件名相同

Javascript中,类名被隐式地设置为脚本的文件名(不包含文件扩展名)。在c#和Boo中必须手工做。

4.在C#中Coroutines有不同语法。

Coroutines必有一个IEnumerator返回类型,并且yield使用yield return… 而不是yield…

using System.Collections;

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

// C# coroutine

IEnumerator SomeCoroutine ()

{

yield return 0;// 等一帧

yield return new WaitForSeconds (2);//等两秒

}
}

5.不要使用命名空间

目前Unity还不支持将代码放置在一个命名空间中,这个需要将会出在未来的版本中。

6.只有序列化的成员变量会显示在检视面板中

私有和保护成员变量只在专家模式中显示,属性不被序列化或显示在检视面板中。

7.避免使用构造函数

不要在构造函数中初始化任何变量,使用Awake或Start实现这个目的。即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个脚本的默认值。构造函数不仅会在无法预料的时刻被调用,它也会为预设或未激活的游戏物体调用。

单件模式使用构造函数可能会导致严重的后果,带来类似随机null引用异常。

因此如果你想实现,如,一个单件模式,不要使用构造函数,而是使用Awake。其实上,没有理由一定要在继续自MononBehaviour类的构造函数中写任何代码。

 

最重要的类

Javascript中可访问的全局函数或C#中的基类

移动/旋转物体

动画系统

刚体

FPS或第二人称角色控制器

 

脚本编译在4个步骤中执行:

1.所有在"Standard Assets", "Pro Standard Assets" 或 "Plugins"的脚本被首先编译。

在这些文件夹之内的脚本不能直接访问这些文件夹之外脚本。不能直接引用或它的 变量,但是可以使用GameObject.SentMessage与它们通信。

2.所有在"Standard Assets/Editor", "Pro Standard Assets/Editor" 或 "Plugins/Editor"的脚本被首先编译。

如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中,例如添加菜单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问前一组中的脚本。

3.然后所有在"Editor"中的脚本被编译。

如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中。例如添加菜单单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问所有前面组中的脚本,然而它们不能访问后面组中的脚本。这可能会是一个问题,当编写编辑器代码编辑那些在后面组中的脚本时。有两个解决方法:1、移动其他脚本到"Plugins"文件夹 2、利用JavaScript的动态类型,在javascript中你不需要知道类的类型。在使用GetComponent时你可以使用字符串而不是类型。你也可以使用SendMessage,它使用一个字符串。

4.所有其他的脚本被最后编译

所有那些没有在上面文件夹中的脚本被最后编译。所有在这里编译的脚本可以访问第一个组中的所有脚本("Standard Assets","ProStandard Assets" or "Plugins")。这允许你让不同的脚本语言互操作。例如,如果你想创建一个JavaScript。它使用一个C#脚本;放置C#脚本到"Standard Assets"文件夹并且JavaScript放置在"Standard Assets"文件夹之外。现在JavaScript可以直接引用c#脚本。放置在第一个组中的脚本,将需要较长的编译时间,因为当他们被编译后,第三组需要被重新编译。因此如果你想减少编译时间,移动那些不常改变的到第一组。经常改变的到第四组。

脚本:内部使用的脚本集合 立即下载

相关推荐

最优化问题——一维搜索(一)

最优化问题——一维搜索 1. 一维搜索的引入 1.1 从非线性规划问题到一维搜索 在前面的文章中,我们提到了基于迭代的非线性规划问题的求解思路。在求解过程中,我们提到了在每一步的迭代中都需要对计算步长因子,其计算公式为: λk=minλf(xk+λp)λ_k=min_{λ}f(x_k+λp)λk​=minλ​f(xk​+λp) 我们将f(xk+λp)f(x_k+λp)f(xk​+λp)视为λ的一元函数,我们的目标就是求这个一元函数的极小值。对于这个问题,我通常的求解方式为一维搜索。 1.2 一维搜索的基本形

hei653779919的博客 7358

【JavaScript 基础】

JavaScript 基础

Jade_Heng_Star的博客 650

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 246

win脚本

1、bat无黑框运行 新键一个.vbs文件里面填写内容 set ws=WScript.CreateObject("WScript.Shell") ws.Run "test.bat",0

luozhichengaichenlei的博客 1920

光学设计必看:如何用泽尼克系数优化镜头像差?从Zemax到实际案例解析

本文深入解析了如何利用泽尼克系数优化镜头像差,从理解其工程价值、解码软件报告,到在Zemax中主动设置优化目标。通过高倍显微物镜等实际案例,详细展示了如何通过分析泽尼克系数诊断问题,并实施针对性优化策略,从而实现对球差、彗差等像差的精准控制,提升光学设计的精细度和系统稳健性。

gg901的博客 1025

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9945

SQLSERVER通用脚本整理

1. 死锁检测脚本 -- 检测死锁 select t1.resource_type [资源锁定类型],DB_NAME(resource_database_id) as 数据库名 ,t1.resource_associated_entity_id 锁定对象,t1.request_mode as 等待者请求的锁定模式 ,t1.request_session_id 等待者SID ,t2.wait_...

そよ風拂过が梢の夏 5324

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

常用小脚本

1、检测网站地址是否存活 #!/bin/bash . /etc/init.d/functions url_list=(www.tec.com www.stu.com) function chkurl(){ i=0 while [ i−lt2]docurlhttp://i -lt 2 ] do curl http://i−lt2]docurlhttp://{url_list[$i]} &am...

wang_wws的博客 620

多物理场耦合仿真-主题032-电磁-流体耦合

电磁-流体耦合,即磁流体动力学(MHD, Magnetohydrodynamics),是研究导电流体在电磁场中运动规律的学科,涉及电磁场与流体力学的深度耦合。本主题系统阐述磁流体动力学的基本理论、控制方程和数值方法。首先介绍MHD的基本概念和物理基础,包括导电流体的性质、电磁场基本方程;然后详细推导MHD控制方程组,包括连续性方程、动量方程、能量方程和电磁场方程;接着讨论MHD流动的特征参数,如Hartmann数、磁雷诺数、相互作用参数等;最后通过六个典型工程案例展示MHD分析的实际应用,包括电磁泵、磁流体

2401_87715305的博客 423

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 3(step by step)

第三章3-1~3-27全部习题解析和代码模块

weixin_62651190的博客 1946

原创|批处理|万能任选APK安装脚本

很多年前,自己写的一个批处理脚本,可以实现任意APK安装,将以下代码复制后,保存到记事本里面,并将后缀名改为*.bat即可运行。 特别说明: (1)请将APK文件放在此脚本同目录下; (2)请确保APK名字中不能存在中文和空格,否则无法安装; @echo off setlocal enabledelayedexpansion mode con:cols=110 lines=40 title 万能任选APK安装工具_2015_11_24_V1.0 by Ruida :start cls echo @@

HRD的博客 2172

python基础:工作会用到的95%的基础python代码都在这了(万字详解!)

本文是一份Python编程语言的快速参考备忘单,涵盖了Python基础语法和常用数据类型。主要内容包括:Python入门指南(打印、变量声明)、内置数据类型(字符串、数值、列表、元组、集合、字典等)、控制结构(判断、循环)、函数定义、文件处理操作以及字符串操作方法(切片、循环遍历等)。这个备忘单特别适合初学者快速查阅Python基础语法,同时也提供了数据类型转换、f-string格式化字符串等实用技巧。通过简洁的代码示例展示了Python的基本语法规则和典型用法。

数据知道的博客 8158

关于Unity内部脚本如何工作的简单概览

这是一个关于Unity内部脚本如何工作的简单概览。 Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同的函数被特定的事件调用。最常用的列在下面: Update: 这个函数在渲染一帧之前被调用。这里是大部分游戏行为代码被执行的地方,除了物理代码。 FixedUpdate       这个函数在每个物理时间步被调用一次。这是处理基于物理游戏行为的地方。 在任

痞子龙3D编程 1792

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Unity脚本知识教程(一)

脚本知识概览 Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面: Update:这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。 FixedUpdate:这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。 在任何函数之外的代码: 在任何函数之外的代码在物体被加载的时候...

qq_35037137的博客 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Unity中的MonoBehaviour脚本-基础知识和继承关系

介绍MonoBehaviour脚本的基础知识.

木头圈 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

初级工程师必备(unity)

一.值类型与引用类型 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。值类型的实例通常是在线程栈上分配的(静态分配)。 引用类型声明时并没有为其分配堆上的内存空间。引用类型的对象总是在进程堆中分配(动态分配)。 值类型(value type):byte,short,int,long,float,double...

爱上游戏开发 2万+

unity下添加c#脚本

在unity中,C#脚本是通过将脚本组件附加到游戏对象(gameobject)上实现的,脚本组件可以用来处理游戏对象的行为和逻辑。每个脚本必须继承自MonoBehaviour类,并且至少包含一个Update方法(或其他unity生命周期方法)可通过Update方法计算并显示每秒频率(FPS),帧率是指每秒显示的帧数,可反映游戏运行的流畅度。右键点击项目窗口中的Assets,选择Create -> C# script。

weixin_42333247的博客 2341

unity c#初级使用脚本语法

概览:用C#编写脚本 除了语法,使用C#或者Boo编写脚本还有一些不同。最需要注意的是: 1.从MonoBehaviour继承 所有的行为脚本必须从MonoBehaviour继承(直接或间接)。在Javascript中这自动完成,但是必须在C#或Boo脚本中显示申明。如果你在Unity内部使用Asset -> Create -> C Sharp/Boo Script菜单创建脚本,创建模...

qq_40729897的博客 834

Unity入门03——Unity脚本

脚本基本规则、生命周期函数、inspector窗口可编辑的变量、MonoBehaviour中的重要内容

weixin_45274937的博客 8579

Unity-Unity脚本生命周期

Unity脚本生命周期是指在Unity游戏引擎中,脚本在运行过程中所经历的各个阶段。这些阶段包括:初始化、更新、固定更新、销毁等。下面我们来详细讲解一下Unity脚本生命周期的各个阶段。

weixin_53163894的博客 2798

Unity里的一些脚本知识

脚本知识 脚本实例-不同游戏对象的同一个脚本指向不同的实例 Edit->ProjectSetting->time里设置每秒调用次数 每帧事件 事件一览 事件 调用 初始化部分 Awake 当该脚本实例初次载入游戏游戏世界时,无论脚本是否被启用,只要游戏对象第一次被启用,就调用 OnEnable 每次当该脚本被启用时调用(包括游戏对象启用连带了脚本启用) Reset 当一个脚本被加入到一个游戏对象中时,触发Reset,只在编辑器下有效(Unity的play模式下也无效

nmdwsm的博客 432

初探 Unity 可视化脚本 |(1)基础知识

Unity Visual Scripting是一个插件,它为Unity编辑器添加了一个可视化的脚本环境。使用Visual Scripting,开发者可以通过拖放节点和连接它们来创建游戏逻辑,这种方式被称为节点式编程。

Unity打怪升级 4413
上一篇: unity3d与web交互的方法
下一篇: Unity3D基础知识梳理
Linux先生
博客等级 码龄20年 97粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值