unity3d入门教程三
- 8.1游戏脚本
- 8.2脚本的使用
- 8.3认识脚本组件
- 8.4帧率
- 9.1游戏脚本
- 9.2获取节点和组件
- 9.3MonoBehaviour
- 9.4父节点与子节点
- 9.5组件的属性
- 9.6脚本的单步调试
8.1游戏脚本
通过程序控制对象属性(如运动,修改transform的位置属性)
8.2脚本的使用
1 新建脚本 Hello.cs ,编辑代码 ,保存一下
在里面写入一个简单的输入输出代码,并且保存
2 把脚本挂载到游戏对象
Add Component | Scripts | …
8.3认识脚本组件
要注意将VS2019与unity进行关联
https://www.jb51.net/article/192667.htm
双击时才会自动打开2019
Update()每帧调用,每秒大概调用几十次
Debug.Log("这是我的第一个游戏");
Debug.Log("In Update() ... " + Time.deltaTime);
游戏启动时,有场景,有对象,肯定先创建游戏对象,对象下的组件创建,如脚本组件创建,脚本中类的实例化但没有最先执行,接着执行start,再按照帧率时间调用update方法更新游戏显示。
8.4帧率
Unity更新频率是不固定的
Debug.Log("这是我的第一个游戏");
Debug.Log("In Update() ... " + Time.deltaTime);
每次间隔是不相等的,unity是尽快进行刷新游戏,无法以固定帧率运行,但可以使其尽量在某个帧率运行
显式设定帧率:
Application.targetFrameRate = 60;
要求 Unity 引擎尽量以此帧率运行 ,但实际帧率还是会有偏差
还是设置一下,使其消耗资源小一些
this.transform.Translate(0, 0.05f , 0); (x,y,z)f表示一个单位
其中,
this.transform 即当前游戏对象的 transform组件
Translate() 调整相对位移
此时运行小飞机就动了
float step = 0.8f * Time.deltaTime;(慢速)float step = 1.2f * Time.deltaTime;(快速)
但是运动速度不够均匀,优化如下
此时无论间隔大小都可以匀速显示
9.1游戏脚本
https://unity.cn/
此文档是辅助手段
9.2获取节点和组件
使用API获取游戏对象和组件
在脚本里操作游戏对象
This是当前myjet组件,此组件挂载到当前游戏对象gameObject上
this.gameObject就是游戏对象,可以获取其下的组件
例如,获取 Sprite Renderer 组件
SpriteRenderer renderer = this.GetComponent<SpriteRenderer>();
也可以写作:
this.gameObject.GetComponent<…>( ) ,Unity内部作了封装
void Start(){//SpriteRenderer renderer = this.gameObject.GetComponent<SpriteRenderer>();//将上方简化为下也是可以的,两者相等SpriteRenderer renderer = this.GetComponent<SpriteRenderer>();//在当前游戏对象下寻找SpriteRenderer组件renderer.flipY = true;
}
演示:添加一个脚本,将小飞机图片翻转。。
按名字来获取节点
GameObject obj = GameObject.Find("/path/of/target");
再获取它下面的组件
SpriteRenderer comp = obj.GetComponent<SpriteRenderer>();
SpriteRenderer renderer = this.gameObject.GetComponent<SpriteRenderer>();将上方简化为下也是可以的,两者相等//SpriteRenderer renderer = this.GetComponent<SpriteRenderer>();在当前游戏对象下寻找SpriteRenderer组件//renderer.flipY = true;//获取其他节点GameObject obj = GameObject.Find("/Other/22");SpriteRenderer renderer = obj.GetComponent<SpriteRenderer>(); //获取该节点的组件renderer.flipY = true; //进行上下翻转
9.3MonoBehaviour
9.4父节点与子节点
如何获取父节点和子节点使用代码
示例1 :获取‘小飞机’的父节点
GameObject parent = this.transform.parent.gameObject;
//获取父节点GameObject parent = this.transform.parent.gameObject;Debug.Log("小飞机的父节点是:" + parent.name);
可以对transfom进行枚举操作得到其节点下的所有子节点
void Start(){//遍历当前对象transform下所有的子节点foreach (Transform child in transform){Debug.Log("子节点:" + child.name);//child.position += Vector3.up * 10.0f;}}
void Start(){遍历当前对象transform下所有的子节点//foreach (Transform child in transform)//{// Debug.Log("子节点:" + child.name);// //child.position += Vector3.up * 10.0f;//}//得到小飞机节点,要转移的目标节点GameObject obg1 = GameObject.Find("飞机");GameObject target = GameObject.Find("物体");//将目标节点作为小飞机的子节点obg1.transform.SetParent(target.transform);
}
保存运行代码时
如何将其挂载到根节点下面,
void Start(){遍历当前对象transform下所有的子节点//foreach (Transform child in transform)//{// Debug.Log("子节点:" + child.name);// //child.position += Vector3.up * 10.0f;//}//得到小飞机节点,要转移的目标节点GameObject obg1 = GameObject.Find("飞机");GameObject target = GameObject.Find("物体");将目标节点作为小飞机的子节点//obg1.transform.SetParent(target.transform);//挂载到场景根节点下面obg1.transform.SetParent(null);
}
运行起来的层级窗口transform属性等数据是实时的,而未运行时显示的是未运行的状态
this.transform.position = new Vector3(1.5f, 1.5f, 0);//移动当前节点飞机的位置,
9.5组件的属性
演示:给 MyJet.cs 添加几个属性
public int number = 10;
public string helloMessage = “Hi”;
之前的飞机运行速度等,若直接将属性定义在start()函数中,是写死的
若将其显示在属性器中,能在属性窗口中更改就方便了
9.6脚本的单步调试
随便在 Start() 方法里添加几行代码 ,用于演示
using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyJet : MonoBehaviour
{public float speed = 1.2f;// Start is called before the first frame updatevoid Start(){Vector3 pos = transform.localScale;Vector3 ratation = transform.localEulerAngles;Vector3 scale = transform.localScale;transform.position = new Vector3(0, 0, 0);}// Update is called once per framevoid Update(){transform.Translate(0, speed * Time.deltaTime, 0);}
}