【Unity3D】四、基础的脚本编程

从脚本开始

将脚本添加给GameObject

有三种方法可以将脚本添加给一个GameObject让其成为它的Component。

  • 将创建的脚本文件直接拖动给目标GameObject
  • 将脚本文件拖动到该GameObject的Inspector面板中
  • 在该GameObject的Inspector面板中最下方选择Add Component然后创建一个新的脚本,直接添加给该GameObject

访问限定词

  • public 修饰的变量在Inspector面板中可见并且可以直接进行调整
  • private 修饰的变量只能在脚本程序中使用,在Inspector面板中不可见
  • public 修饰的变量或者方法,在其他类中使用该类的实例,可以访问该类下的这些变量与方法
  • private 修饰的变量只能在本类中使用和调用,不能被其实例访问

几个周期函数

  • Awake()
    • 在脚本被初始化的时候调用,尽管该脚本可能已经被禁用
    • 在整个脚本的生命周期中只调用一次
  • Start()
    • 在脚本第一次要Update之前,必须是在该脚本是enable的情况下
    • 在整个脚本的生命周期中只调用一次
  • Update()
    • 在每一帧出现时调用
    • 每次更新的时间间隔不同
    • 一般用于:
      • 移动非物理化物体的时候
      • 简单的定时器
      • 接收到输入的时候
  • FixedUpdate()
    • 每次物理操作之后调用
    • 两次更新时间间隔一致
    • 一般用于:
      • 调整物理物体(Rigidbody,刚体)

Unity3D中的向量

向量运算

  • 二维向量 Vector2
    • 向量的模:magnitude
    • 向量的分量:x y
    • 判定向量相等:Equals
    • 向量单位化:Normalize
    • 向量转化成字符串:ToString

完整Vector2参考:https://docs.unity3d.com/ScriptReference/Vector2.html?_ga=2.148748272.693619093.1552224779-1809290818.1551791741

  • 三维向量 Vector3
    • 向量的模:magnitude
    • 计算向量的模的平方,单纯为了比较大小,比计算模速度快:sqrMagnitude
    • 判定向量相等:Equals
    • 向量转化成字符串:ToString
    • 向量的内积(点乘)运算:Dot
      Vector3.Dot(VectorA, VectorB)
      向量的内积(点乘)
    • 向量的外积(叉乘)运算:Cross
      Vector3.Cross(VectorA, VectorB)
      右手坐标系

      向量的外积(叉乘)

GameObject与Component

获取Component

  • 获取同GameObject下的Component
    ComponentType componentName = GetComponent<ComponentType>();
  • 获取其他GameObject下的Compnent
    • 先声明一个public变量,然后将其他GameObject的相应的Component拖动到该变量处赋值
    • 先找到该GameObject再获取Component
GameObject gameObjectName = GameObject.Find("  ");
ComponentType componentName = gameObjectName.GetComponent<ComponentType>();

控制Component是否可用

// if  componentName  is a component got already
componentName.enabled=false;     //disable the component
componentName.enabled=true;     //enable the component

获取GameObject

  • 获取脚本所属GameObject:直接使用 gameObject
  • 获取其他/一般的GameObject
  • 声明一个public变量,将目标GameObject拖到该参数处为其赋值
  • 使用Find方法
    GameObject gameObjectName = GameObject.Find(" ");
  • 使用FindGameObjectsWithTag或者FindWithTag获取:为GameObject添加Tag可以在Instector面板中完成


    为GameObject添加Tag
ComponentType componentName = GameObject.FindGameObjectsWithTag("tag");
ComponentType componentName = GameObject.FindWithTag("tag");

控制GameObject是否可用

// if  gameObjectName  is a GameObject got already
gameObjectName.SetActive(false);     //disable the GameObject
gameObjectName.SetActive(true);     //enable the GameObject

判断GameObject是否可用

// if gameObjectName is a GameObject got already

语法 作用
gameObjectName.activeSelf 判断其本身是否active,其父物体为disable,但是其本身可能还是active
gameObjectName.activeInHierarchy 判断其所在分级是否active,即其父物体是否active

获取Transform

  • 获取脚本所在GameObject的Transform:直接使用 transform
  • 获取其他GameObject的Transform:先使用上述方法得到GameObject,然后使用 gameObjectName.transform

移动(Translate)和旋转(Rotate)

  • Translate:Transform的方法,以一个Vector3为参数,按照Vector3所描述的方向与大小移动
  • Rotate:Transform的方法,以一个Vector3为参数,按照Vector3所描述的方向与大小旋转
  • LookAt:摄像机跟踪目标:Transform.LookAt():以一个transform为参数,使得摄像机的transform跟随参数的transform变动,即实现跟踪

销毁(Destroy)

Destory(GameObject/Component);
Destory(GameObject/Component,DelaySecond);

获取输入

获取按键输入

  • ButtonInput:获取键钮,在 Edit -> Project Settings -> Input 中可以看到各种预设好的按键,读取这些键钮的名称作为GetButton的参数
Input.GetButtonDown("name");     // 键钮按下时的一帧为true
Input.GetButton("name");     // 键钮按下时保持为true
Input.GetButtonUp("name");     // 键钮按下然后释放后的状态下保持为true
  • KeyInput:获取键钮
Input.GetKeyDown(KeyCode.name);     // 键钮按下时的一帧为true
Input.GetKey(KeyCode.name");     // 键钮按下时保持为true
Input.GetKeyUp(KeyCode.name");     // 键钮按下然后释放后的状态下保持为true

KeyCode完整参考:https://docs.unity3d.com/ScriptReference/KeyCode.html

获取水平/竖直轴向输入

使用以下函数均可传入一个参数的两个值:“horizontal”、“vertical”来分别表示水平和竖直方向的运动

Input.GetAxisRaw() //在参数设置的方向上返回 -1 或 1 两个值中的一个,即即止即停
Input.GetAxis() //在参数设置的方向上返回一个 -1 到 1 之间的float值,即有一定的缓冲变动的效果

获取鼠标输入

  • OnMouseDown():当鼠标点击GUIElement或者Collider时触发
  • OnMouseDrag():当鼠标点击GUIElement或者Collider并仍然按住时触发
  • OnMouseEnter():当鼠标进入GUIElement或者Collider时触发
  • OnMouseExit():当鼠标离开GUIElement或者Collider时触发
  • OnMouseOver():只要鼠标在GUIElement或者Collider上时的每一帧都会触发
  • OnMouseUp():当鼠标被释放时触发
  • OnMouseUpAsButton():当鼠标在点击了GUIElement或者Collider后并且释放时触发

DeltaTime

DeltaTime是指的每两个 Update() 函数或者 FixedUpdate() 函数调用之间的时间间隔,使用 Time.deltaTime 获得

数据类型

数据类型

类(Classes)

  • 脚本名称和类名需要相同
  • 详细情况与C#类一致

实例化预设体(Instantiate Prefab)

使用 Instantiate 来创建某个预设体(Prefab)的复制品(Clones):
首先使用public变量来获取目标Prefab:public PrefabType prefabName

  • Instantiate(prefabName):从prefabName的预设体创建一个克隆体生成在坐标原点处
  • Instantiate(prefabName,Position,Rotation):规定预设体的位置与角度
  • Type referencereference = Instantiate(prefabName,Position,Rotation) as Type;:将预设体生成在指定位置与角度并且进行类型转换成Type类型

Instantiate完整参考:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html?_ga=2.116872129.693619093.1552224779-1809290818.1551791741

数组(Arrays)

在Unity的脚本中声明一个 public 类型的数组变量,不需要传入具体的大小,这样的数组可以在Inspector处直接更改数组大小,并且随着数组大小的改变还会自动为你添加每一个数组的参数值。
然后使用 foreach 循环或者 for 循环可以很方便的遍历整个数组。

public GameObject[] gameObjects;

void Start()
{
    Debug.Log("Using For");
    for(int i = 0; i < gameObjects.Length; i++)
    {
        Debug.Log(gameObjects[i].name);
    }

    Debug.Log("Using Foreach");
    foreach(GameObject items in gameObjects)
    {
        Debug.Log(items.name);
    }
}
使用public的数组赋值

其他

调用(Invoke)

Invoke()函数可以在一定时间后以及每一定时间间隔内调用某个方法,要求该方法必须是 0个参数,void返回值的函数。

比如我们有一个函数 LogHello

void LogHello()
{
    Debug.Log("Hello World!");
}

使用 Invoke 来调用该方法:

  • Invoke("LogHello", delayTime):第一个参数为要调用的方法的名称(字符串),第二个参数为要推迟多少时间调用该方法(单位:s)
  • InvokeRepeating("LogHello", delayTime, gapTime):前两个参数同上,第三个参数规定在第一次调用后每隔多长时间调用一次(单位:s)
  • CancelInvoke("LogHello"):传入要停止Invoke的方法名称(字符串)

线性插值(Linear Interplotation)

线性插值是在两个给定值之间找到一个百分比的值。比如在3和5之间找到一个50%处的值,即f4

  • Mathf.Lerp:三个float类型参数,前两个规定起止值,最后一个规定百分比,返回一个float类型的值
    float result = Mathf.Lerp (3f, 5f, 0.5f); // result = 4
  • Color.Lerp:返回两个颜色值的百分比处的插值结果
  • Vector3.Lerp:返回两个三维向量的百分比处的插值结果
Vector3 from = new Vector3 (1f, 2f, 3f);
Vector3 to = new Vector3 (5f, 6f, 7f);
Vector3 result = Vector3.Lerp (from, to, 0.75f);     // result = (4, 5, 6)

好久不见!前一阵子由于一些原因暂时搁置了博客,现在重新捡回来!正赶上暑假开始了!为了未来一些挑战所准备,暑期期间决心刷LeetCode算法题,应该也会好好地将刷题期间学到的东西写上来分享,也算是一个对自己的监督!

如果一定要说近期忙的啥,那就贴一个链接出来吧~
NUS Summer Workshop 2019 VR Group6 兽山行 宣传视频
希望大家多多指教!

转载请注明出处,本文永久更新链接:https://blogs.littlegenius.xin/2019/08/03/Unity3D基础脚本编程/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容