Unity 部分基础内容
Gameproject
是object的子类,拥有unity所有实例的属性和组件。
Transfrom组件:
基础组件,拥有position(位置) ,size(大小),rotaze(旋转) 三个属性。 所有组件都有transfrom组件。
获取Gameproject内的组件属性。
使用getcomponent组件来获取实体内属性。
GetComponent<T>();
Debug.Log(this.GetComponent<T>());
获取Gameproject外的组件属性。
using UnityEngine;
public class MyTest : MonoBehaviour {
public Camera mCamera;
void Start()
{
Debug.Log(this.GetComponent<Camera>().fieldOfView += 20);
}
}
通过gameobject的查找方法来获取组件
using UnityEngine;
public class MyTest : MonoBehaviour {
private Camera mCamera;
void Start()
{
mCamera = GameObject.Find("Main Camera").GetComponent<Camera>(); //名称查找
mCamera.fieldOfView += 20;
}
}
//查询单个物体:
private GameObject cube;
void Start()
{
cube = GameObject.FindWithTag("Player");
}
//数组查找
private GameObject[] enemies;
void Start()
{
enemies = GameObject.FindGameObjectsWithTag("Enemy");
}
transfrom查找:
using UnityEngine;
public class WayPoint : MonoBehaviour {
//定义一个Transform类型的数组
public Transform[] waypoints;
private void Start()
{
//设置数组的大小为当前物体的子物体个数
waypoints = new Transform[transform.childCount];
int i = 0;
//遍历子物体,并将值依次赋给waypoint数组的每个项
foreach (Transform t in transform)
{
waypoints[i++] = t;
}
}
}
三维视图
三维视图有两种,一种是模拟现实,以当前操作视角为主视角的界面,上帝界面,远小近大。
第二种是参考视图,大小相等
刚体:
rigidbody 物理系统
对物体产生模拟现实的物理状态
shader
着色器,技美需学 ,渲染图形的方式,enb
材质
字面意思,物品本身的材质
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
public Rigidbody rd; //创建刚体
// Start is called before the first frame update
void Start()
{
rd = GetComponent<Rigidbody>(); //接收刚体
Debug.Log("已经施加了一个力");
}
// Update is called once per frame
void Update()
{
float ad = Input.GetAxis("Horizontal"); //键盘获取特点键位值,按住0缓慢过度-1,取消缓动为0.长按持续-1
float ws = Input.GetAxis("Vertical");
float spe = Input.GetAxis("Jump");
rd.AddForce(new Vector3(ad,spe,ws));
// Addforce 添加力,vector 向量(方向,长度)
}
}
相机跟随运动:
找出相机与需跟随物体的偏移量(距离),如果运动,那么就设置相机基于球当前位置加上偏移量
预制体:
模版,批量对特定对象进行操作,批量操作。复制,删除,修改属性
获取属性:
collider //组件
gameObject //物体
销毁物体:
Destory();
碰撞检测
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag=="food") {
Debug.Log("发生碰撞了");
Destroy(collision.gameObject);
score++;
testscore.text = "分数:" + score;
if (score == 10)
{
gboject.SetActive(true);
}
}
}
触发检测
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "food")
{
Debug.Log("发生检测");
Destroy(other.gameObject);
score++;
testscore.text = "分数:" + score;
if (score == 10)
{
gboject.SetActive(true);
}
}
}
生命周期:
一般来说有两个状态,编辑状态,运行状态,如下图
AWAkE函数:字面上就是英文的唤醒的意思,这个将在场景中所有的对象被初始化后调用,且在整个生命周期内仅被调用一次。在这个函数中,我们通常来做一些查找对象及设置脚本间引用的操作,比如GetComponent和Find,需要注意的是,Awake函数可以调用但不能作为协同程序 简称协程,
private IEnumerator Awake()
{
yield return null;
Debug.Log("Awake");
}
OnEnable函数,字面意思是当被启用时,对象实例被激活时会调用一次,脚本被添加时,也会被调用,常用于UI激活时处理一些逻辑。
private void OnEnable()
{
Debug.Log("OnEnable函数调用");
}
Start函数,字面意思是开始,仅在脚本实例被启用时调用,Start函数总是在Awake之后Update之前执行,在整个生命周期中只被调用一次。我们通常在这个函数中来进行一些初始化操作,比如一些赋初始值。
void Start()
{
Debug.Log("Start函数调用");
}
Update函数,字面意思是更新,正常的帧更新,每一帧都会执行,主要用于处理逻辑更新,比如我们需要在每一帧中监测用户的输入事件。
private void Update()
{
Debug.Log("Update函数调用");
}
FixedUpdate函数,字面意思是固定帧更新,固定频率更新,可以在Edit-Project Setting -Time中的Fixed timestep来设置Fixedupdate的更新频率,默认更新频率为0.02s。通常用于物理计算,比如给刚体施加作用力。
private void FixedUpdate()
{
Debug.Log("FixedUpdate函数调用");
}
OnTriggerXXX,字面意思是当触发的时候,属于物理系统,通俗叫法:触发器。有三种状态(替换前面的XXX):Enter(进入),Stay(停留),Exit(退出),FixedUpdate之后执行,通常配合刚体使用,实际的项目中常被用来做触发装置,比如开门,子弹射击到物体的触发等等。我们将在后续的物理系统中详细解析。
private void OnTrigger()
{
Debug.Log("OnTrigger函数调用");
}
OnCollisionXXX,字面意思是当碰撞的时候,也属于物理系统,通俗叫法:碰撞器。跟触发器一样,也有三种状态(替换前面的XXX):Enter(进入),Stay(停留),Exit(退出),在FixedUpdate之后执行,通常配合刚体使用,实际项目中通常用于物理碰撞,比如车子撞到石头,如果需要子弹打击物体让物体直接被击飞也可以使用碰撞器。我们将在后续的物理系统中详细解析。
LateUpdate函数,字面意思是后更新,这个函数将在上面所有的update函数调用后被调用,每帧更新,通常用于摄像机跟随,避免出现空帧现象(相机已经推进,但是在视窗上还没看到角色)。
private void LateUpdate()
{
Debug.Log("LateUpdate函数调用");
}
OnGUI,GUI是Graphical User Interface的简写,即图形用户界面,早期用的较多的界面函数,也是每帧更新。
private void OnGUI()
{
Debug.Log("OnGUI函数调用");
}
OnDisable函数,字面意思是当被禁用时,对象实例被禁用时后调用一次,当物体被destory时会被调用,脚本被销毁时也会被调用。需要注意的是,OnDisable也不能用于协程。
private void OnDisable()
{
Debug.Log("OnDisable函数调用");
}
OnDestory函数,字面意思是当被销毁时,当一个继承于MonoBehaviour的对象被销毁时被调用,OnDestory只会在预先已经被激活的游戏对象上被调用。需要注意的是,OnDestroy也不能用于协程序。
private void OnDestroy()
{
Debug.Log("OnDestroy函数调用");
}
时间类:
截图保存脚本:
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour
{
//存储路径:在项目assets目录下的ScreenshotFolder文件夹内
string folder = "Assets/ScreenshotFolder";
//设定帧率为25
int frameRate = 25;
void Start()
{
// 设置播放帧率 (real time will not relate to game time after this).
Time.captureFramerate = frameRate;
// 创建文件夹
System.IO.Directory.CreateDirectory(folder);
}
void Update()
{
// 设置文件名的格式为:0001 shot.png
string name = string.Format("{0}/{1:D04} shot.png", folder, Time.frameCount);
// 截图到对应的路径中
ScreenCapture.CaptureScreenshot(name);
}
}
3、UnityEngine.Time.fixedDeltaTime :
固定增量时间,返回FixedTimeStep。FixedUpdate执行的时间间隔和物理检测的时间间隔。
注意一下,这个是依据的是Time.time,也就是当Time.time累加的值等于了FixedTimeStep,那么FixedUpdate和物理检测就会执行,可以理解成当时间被加速,和此时间有关的会被更频繁的执行,所以当Time.timeScale为0时,FixedUpdate不会被执行。
4、UnityEngine.Time.fixedTime :
固定时间,上一次FixedUpdate开始执行的时间,从程序开始计时。
5**、UnityEngine.Time.frameCount :**
帧计数器,返回游戏一共经过了多少帧。
6、UnityEngine.Time.maximumDeltaTime :
一帧所需的最大时间,如果一帧所需的时间可能大于这个值,那么一些物理检测和其他一些固定帧的更新将会减少执行。
7、UnityEngine.Time.realtimeSinceStartup :
从程序启动到现在的时间,依据系统时间,不受Time.timeScale影响,当程序处于后台时,这个时间依然有效,不会停止计时,不管程序可不可以在后台运行。
8、UnityEngine.Time.renderedFrameCount :
这个没有找到任何官方文档,比较奇怪。从字面上理解,就是被渲染帧的次数。尝试在Update(还有FixedUpdate和LateUpdate,这两个和Update的值是一样的)里输出一下,会发现这个次数每次都是增加2,而不是增加1,这就很奇怪吧,Update是每一帧都要执行的,这个是肯定的,也就是再每一帧其实是渲染了两次的。想了一下,在一帧中,还有可能被执行的还有OnGUI,结果在里面输出一下发现,多增加的1果然是在这里面。这个应该用的比较少。
9、UnityEngine.Time.smoothDeltaTime :
一个平滑淡出Time.deltaTime的时间。在Update里和Time.deltaTime输出比较一下就会发下,这个值是当前的Time.deltaTime和上一帧的Time.smoothDeltaTime的一个差值的中间值。
10、UnityEngine.Time.time :
程序内部的一个时间,返回当前帧开始的时间,受Time.timeScale影响。在FixedUpdate里调用,将返回Time.fixedTime。当程序处于后台时,如果程序不可以在后台运行,这个时间将失效,不会再计时了。
11、UnityEngine.Time.timeScale :
时间缩放,影响一切基于Time.time的行为。
12、UnityEngine.Time.timeSinceLevelLoad :
从场景加载完到现在的时间,基于Time.time。
13、UnityEngine.Time.unscaledDeltaTime :
忽略Time.timeScale的Time.deltaTime。在刚开始的两帧貌似不太准
14、UnityEngine.Time.unscaledTime :
把每一帧的Time.unscaledDeltaTime 加起来就是这个属性的值,虽然说理解功能上Time.realtimeSinceStartup 有点相似,当时两者并不想等,就是因为Time.unscaledDeltaTime在程序开始不太准确的原因,导致和 realtimeSinceStartup 会有误差,这个要注意一下。
vector3类
三维引擎中表示向量的类,根据向量的维度定义为:vector2、vector3、vector4。其中用的最多、最广的是vector3这个类,我们可以通过f12(转到声明)来追溯一下在unity中这个类的成员变量。
成员变量 | 说明 |
---|---|
x | 向量的x分量 |
y | 向量的y分量 |
z | 向量的z分量 |
normalized | 得到标准化的向量 |
magnitude | 得到向量的长度 |
sqrmagnitude | 得到向量长度的平方 |
常用方法 | 说明 |
---|---|
cross | 向量叉乘 |
dot | 向量点乘 |
project | 计算向量在另一个向量的投影 |
angle | 返回两个向量之间的夹角 |
distance | 返回两个向量之间的距离 |
Lerp | 两个向量之间进行线性插值 |
operator + | 向量加法 |
operator - | 向量减法 |
operator * | 向量乘以标量(数乘) |
operator/ | 向量除以标量 |
operator == | 若两向量相等返回true |
operator != | 若两向量不等返回true |