Unity(一)Unity脚本程序开发

最近实验室有AR的项目,需要用Unity进行开发,一边学习一边把知识总结下来。在开始项目之前讨论过项目的技术方案,用Unity开发还是用Unreal开发,本人在两种游戏引擎上都有过初步的接触,认为Unreal作为后起之秀确实在某种程度上强于Unity,比如软件的设计、画面逼真程度,但作为一名程序员,实在对蓝图编程无感,对代码更加放心,还是更喜欢Unity的编程风格,因此选择了Unity,开始了漫长的Unity学习之路,学习资料是《Unity 5.X 3D游戏开发技术详解与典型案例》,欢迎交流。

一、Unity脚本概述

Unity脚本继承自MonBehaviour类,类中定义了各种回调方法,如Start、Update和FixedUpdate。

public class NewBehaviourScript: MonoBehaviour{...}

开发脚本时,主要时继承MonoBehaviour类并重写其中特定的方法。

Start方法:游戏场景加载时被调用,在该方法可以写一些游戏场景初始化的代码。

Update方法:在每一帧渲染之前被调用,大部分游戏代码在这里执行,除了物理部分的代码。

FixedUpdate方法:在固定的物理时间步调调用一次,基本物理行为代码执行的地方,如刚体Rigidbody,其中代码的执行和游戏的帧速率无关。

需要注意的是,1.在创建脚本时,类名字必须匹配文件名。2.类中的成员变量可以时private、protected和public,如果想在属性查看器中显示,其必须是public类型的。3.尽量避免在类中使用构造函数。

二、Unity脚本的基础语法

1.常用操作

Unity中很多对游戏对象的操作都是在脚本中修改对象的Transform(变换属性)与Rigidbody(刚体属性)参数来实现的。

让物体绕x轴旋转20°和让物体向前移动1个单位长度:

this.transform.Rotate(20,0,0); //绕x轴旋转20°
this.transform.Translate(0,0,1) //向前移动1个单位长度

第四个参数为Space枚举类型,Space.Self相对于自身轴(默认),Space.World相对于世界坐标系统。

2.记录时间

Time类中重要的变量为deltaTime,指的是从最近一次调用Update或FixedUpdate方法到现在的时间,如果想均匀地旋转一个物体,不考虑帧速率的情况下,可以乘以Time.deltaTime。

public GameObject gameObject; //声明一个游戏对象
void Update(){Vector3 te = gameObject.transform.position; //    获取游戏对象的位置坐标te.y += 5*Time.deltaTime; //沿y轴每秒上升5个单位gameObject.transform.position = te; //设置游戏对象的位置坐标
}

3.访问游戏对象组件(Component)

组件属于游戏对象,是游戏的属性,变量是在脚本中体现的,常用的组件可以通过简单的成员变量取得,所有的脚本都是组件。

 

常见的成员变量
组件名称变量名称组件名称变量名称
TransformtransformRigidbodyrigidbody
RendererrendererCameracamera
LightlightAnimationanimation
Collidercollider  

在Unity 脚本中,附加到游戏对象上的组件可以通过GetComponent方法获得。

transform.Translate(1,0,0); //沿x轴移动一个单位,变量访问
GetComponent<Transform>().Translate(1,0,0) //沿x轴移动一个单位,组件访问

也可以通过GetComponent方法获取其他的脚本,比如有一个HelloWorld的脚本,里面有一个sayHello方法,HelloWorld脚本要与调用它的脚本附加在同一游戏对象上。

HelloWorld helloWorld = GetComponent<HelloWorld>(); //获取“HelloWorld”脚本组件
helloWorld.sayHello(); //执行sayhello方法

注意:C#中只有public类型的变量和方法才能在所有其他类中使用,private类型的变量和方法只能在自身类中使用,protected类型的变量和方法只能在子类和同命名空间下的类中使用。

4.访问其他游戏对象

(1)通过属性查看器指定参数。

(2)确定对象的层次关系,游戏对象在游戏组成对象列表中存在父子关系,在代码中可以通过获取Transform组件来找到子对象或父对象。

transform.Find("hand").Translate(0,0,1) //找到“hand”子对象
transform.parent.Translate(0,0,1) //找到父对象
transform.Find("hand").GetComponent<Test>().doSomething();
//找到子对象“hand”,同时执行“Test”脚本中的doSomething方法
transform.Find("hand").GetComponent<Rigidbody>()AddForce(0,0,2)//加一个沿z轴的大小为2的力

(3)通过名字或标签获取游戏对象

FindWithTag方法获取指定标签的游戏对象,Find方法获取指定名字的游戏对象。

GameObject name = GameObject.Find("somename"); //获取名称为“somename”的游戏对象
name.transform.Translate(0,0,1);
name.GetComponent<Test>().doSomething(); //执行Test脚本中的doSomething方法
GameObject tag = GameObject.FindWithTag("sometag"); //获取标签为“sometag”的游戏对象
tag.GetComponent<Test>().doSomething();

(4)通过传递参数获取游戏对象

一些事件回调方法的参数中包含了特殊的游戏对象或组件信息,例如触发碰撞事件的Collider组件。在OnTriggerStay方法的参数中有一个碰撞体参数,通过这个参数能得到碰撞的刚体。

void OnTriggerStay(Collider other){ //重写OnTriggerStay方法if(other.GetComponent<Rigidbody>()){ //如果该游戏对象上有刚体组件other.GetComponent<Rigidbody>().AddForce(0,0,2); //给刚体施加一个力}
}

(5)通过组件名称获取游戏对象

Unity脚本中可以通过FindObjectsOfType方法和FindObjectOfType方法来找到挂载特定类型组件的游戏对象。

Test test = FindObjectOfType<Test>(); //理解为Test代表挂载Test组件的游戏对象的类
Debug.Log(test.gameObject.name); //类比this.gameObject,this理解为当前脚本组件
Test[] tests = FindObjectsOfType<Test>();
foreach (Test re in tests){Debug.Log(te.gameObject.name);
}

注:关于GameObject与gameObject的理解,GameObject是一个类,是一个容器,可实例化为游戏对象,包含不同组件;gameObject获得当前脚本所挂载的对象,是一个实例化的结果,上例中test.gameObject可类比此意。gameObject是组件附加的游戏物体(不是组件,是MonoBehaviour类中可继承的成员变量),一个组件总是被附加到一个游戏物体。

5.向量

Vector2类表示二维向量,Vector3表示三维向量。向量初始化:

public Vector3 position1 = new Vector3();
public Vector3 position2 = new Vector3(1,1,2);
void Start(){position1.x = 1;position1.y = 1;position1.z = 2;
}

Vector3类中定义了很多常量,对应特殊的Vector3值。

Vector3类中常量对应的值
常量常量
Vector3.zeroVector(0,0,0)Vector3.oneVector(1,1,1)
Vector3.forwordVector(0,0,1)Vector3.upVector(0,1,0)
Vector3.rightVector(1,0,0)  

Vector3求两点之间的距离:

public Transform ren; 
//如果声明的是一个组件变量,需要在属性查看器中拖拽游戏对象到变量处并确定它的值
void Update(){if(Vector3.Distance(ren.position,transform.positon)<10){Debug.Log(ren.position);}
}

6.静态成员变量

在C#脚本中可以通过static关键字来创建全局变量,这样就可以在不同脚本间调用这个变量。

public static int test;

如果想从另外一个脚本中调用变量,可以通过“脚本名.变量名”的方法来调用。

Test.test = 1; //为Test脚本中的“test”变量赋值

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新型人造DNA结构信息密度加倍

来源&#xff1a;中国科学报脱氧核糖核酸&#xff08;DNA&#xff09;中存储着遗传代码。它由4种核苷酸组成&#xff0c;以4个不同字母表示。美国研究人员最新合成一种由8个字母组成的新型DNA结构。其信息存储密度加倍&#xff0c;未来有望应用于合成生物等领域。DNA是存储及传…

android studio升级时提示 Connection failed. Please check your network connection and try again

原文地址 http://www.eyeapk.com/android-studio-update.html Mac OSX中修改文件路径为 bin/idea.vmoptions &#xff0c;添加如下内容&#xff0c;如果无效修改http为https试试看 -Djava.net.preferIPv4Stacktrue -Didea.updates.urlhttp://dl.google.com/android/studio/patc…

未来的农业没有农民

来源 &#xff1a; science robotics作者 &#xff1a;Senthold Asseng、Frank Asche编译&#xff1a;机器之能 微胖摘要&#xff1a;本文取自最新一期Science Robotics 的Future farms without farmers 一文。文章认为&#xff0c;未来农场的所有组成部分已经存在。随着时间的…

模式识别与机器学习笔记(一)

本系列博文是对研一课程《模式识别与机器学习》的随堂笔记&#xff0c;希望将老师所讲的与自己的见解记录下来&#xff0c;方便加深自己的理解以及以后复习查看&#xff0c;笔记完全按照老师所讲顺序&#xff0c;欢迎交流。 一、模式识别与机器学习的基本问题 机器学习主要解…

MYSQL 定时任务

设置定时任务时&#xff0c;首先将event_scheduler设置为1&#xff0c;以开启事件计划功能。 1.开启功能----------------------------------------执行命令 set global event_scheduler1; select event_scheduler;----------------------------------------OR ---------------…

重磅推荐:中国人工智能趋势报告(完整版)

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云…

模式识别与机器学习笔记(二)机器学习的基础理论

机器学习是一门对数学有很高要求的学科&#xff0c;在正式开始学习之前&#xff0c;我们需要掌握一定的数学理论&#xff0c;主要包括概率论、决策论、信息论。 一、极大似然估计&#xff08;Maximam Likelihood Estimation&#xff0c;MLE &#xff09; 在了解极大似然估计之…

POJ 3660 Cow Contest【传递闭包】

解题思路&#xff1a;给出n头牛&#xff0c;和这n头牛之间的m场比赛结果&#xff0c;问最后能知道多少头牛的排名。 首先考虑排名怎么想&#xff0c;如果知道一头牛打败了a头牛&#xff0c;以及b头牛打赢了这头牛&#xff0c;那么当且仅当ab1n时可以知道排名&#xff0c;即为此…

Cell Stem Cell:研究人员开发出大脑类器官用于研究认知障碍!

图片来源&#xff1a;Cell Stem Cell来源&#xff1a;细胞摘要&#xff1a;来自耶鲁大学的研究人员近日在实验室培养皿中模拟了两种大脑结构以及它们之间的相互作用&#xff0c;为揭示神经精神疾病的起因带来了曙光。耶鲁大学遗传学副教授In-Hyun Park及其团队创造了大脑中丘脑…

图像处理与图像识别笔记(一)

本系列是研一课程《图像处理与图像识别》的随堂笔记&#xff0c;主要内容是数字图像处理方面&#xff0c;根据老师的讲课内容与自己的理解所书写&#xff0c;还会有一些具体实现的代码&#xff0c;基于Python&#xff0c;欢迎交流。本篇主要介绍图像处理与图像识别的基础知识。…

java日期处理总结

1.java.sql.Date 从数据库中取出的日期格式(rs.getDate())是java.sql.Date&#xff0c;这是java.util.Date的子类。查询API后发现可用的方法很少。包含构造只有4个&#xff1a; Date(long date) 使用给定毫秒时间值构造一个 Date 对象。voidsetTime(long date) …

神经网络的黎明

来源&#xff1a;中信出版社摘要&#xff1a;任何人工智能的难题都可以被解决。唯一能证明这一论断成立的是这样一个事实&#xff1a;自然界通过进化已经解决了这些难题。但在20 世纪50年代就已经存在各种暗示&#xff0c;如果AI 研究者能够选择完全不同于符号处理的方式&#…

计算机视觉(一)概述

一、什么是计算机视觉 计算机视觉(Computer Vision)是一门如何使计算机“看”的学问&#xff0c;让摄像头和电脑代替人眼对目标进行识别、跟踪、测量等机器视觉。计算机视觉能够模拟人类视觉的优越的能力&#xff0c;如识别物体、估计立体空间与距离、躲避障碍、理解图像、想象…

Php通过gsoap调用c++ websevice

&#xfeff;&#xfeff;Php通过gsoap调用c websevice 由于工作的关系&#xff0c;需要通过php调用c使用gsoap编写的websevice&#xff0c;其中遇到了很多困难&#xff0c;特此进行总结如下&#xff0c;也方便大家以后的使用和提高。 其中服务端采用c编写而成&#xff0c;客户…

图像处理与图像识别笔记(二)图像变换

在本章节中&#xff0c;将介绍几种常用的图像变换的方法&#xff0c;即利用数学公式将图像变换成另一种具有特定物理意义的图像&#xff0c;通过新的图像&#xff0c;我们可以观察出原图像的某些特性&#xff0c;且可以对原图像进行滤波、压缩等图像处理的操作&#xff0c;包括…

图解|2018年度中国科学十大进展

来源&#xff1a;锐科技 2019年2月27日&#xff0c;科技部基础研究管理中心召开“2018年度中国科学十大进展专家解读会”&#xff0c;发布了2018年度中国科学十大进展。以下10项重大科学进展入选&#xff1a;01 基于体细胞核移植技术成功克隆出猕猴02 创建出首例人造单染色体真…

sql 系统函数取表基本信息

SELECT 表名case when a.colorder1 then d.name else end, 序号a.colorder, 列名a.name, 数据类型b.name, 长度COLUMNPROPERTY(a.id,a.name,PRECISION), 小数位isnull(COLUMNPROPERTY(a.id,a.name,Scale),0), 标识case when COLUMNPROPERTY( a.id,a.name,IsIdentity)1 then √…

《麻省理工学院技术评论》评出最新十大突破性技术

来源&#xff1a;新华网摘要&#xff1a;全球知名科技评论期刊《麻省理工学院技术评论》27日发布2019年“全球十大突破性技术”&#xff0c;灵巧机器人、核能新浪潮、定制癌症疫苗、人造肉汉堡等入选。这份期刊的中文版官网当天发布公报说&#xff0c;今年是该杂志创刊120周年&…

图像处理与图像识别笔记(三)图像增强1

图像增强的目的是为了改善图像的视觉效果&#xff0c;为了更便于人或机器的分析和处理&#xff0c;在不考虑图像降质&#xff08;前提&#xff09;的情况下&#xff0c;提高图像的可观性。灰度变换是一种典型的图像增强方法&#xff0c;我们通常把图像处理按照处理方法分成空域…

图像处理与图像识别笔记(五)图像增强2

上一节中我们讲解了灰度变换的原理以及实现方法&#xff0c;本节我们讲解空域滤波增强&#xff0c;与灰度变换相同&#xff0c;空域滤波增强是一种空域处理的方法&#xff0c;不过空域滤波不是一种对点做处理的方法&#xff0c;而是利用相邻像素间的关系进行增强。空域滤波可以…