unity 基础一

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);
            }
        }
    }

生命周期:

一般来说有两个状态,编辑状态,运行状态,如下图

img

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值