Unity3d学习笔记

Unity中的脚本类均继承自MonoBehaviour


Time.deltaTime

  • 游戏中一帧的时间(秒)
  • 假如1秒运行60帧,则一帧为1/60秒;假如游戏运行时卡顿,帧数变为30帧,则一帧为1/30秒

Time.timeScale

  • 时间伸缩,类似于视频中的倍速播放
  • 当timeScale=1时,时间为正常倍速。当timeScale=0,时间静止,可以用于暂停游戏。
  • 假如timeScale=0.5,则原来需要1秒来执行完的动画,特效等,现在需要1/timeScale=2秒来执行完成
  • timeScale不会影响Update()和LateUpdate(),只会影响FixedUpdate()

Time.time

  • 游戏开始运行到现在经历的时间(秒),该变量会受到时间伸缩的影响

Time.realtimeSinceStartup

  • 游戏开始运行到现在实际经历的时间(秒),该变量不受时间伸缩的影响

Time.timeSinceLevelLoad

  • 关卡加载完成到现在的时间(秒)

Time.fixedDeltaTime

  • 固定的时间间隔(秒)

Time.maximumDeltaTime

  • 游戏开始到现在最耗时的一帧(秒),可用于游戏优化

Time.smoothDeltaTime

  • 游戏开始到现在平均一帧的时间

Time.frameCount

  • 游戏的帧计数

void Awake() 

  • 脚本初始化时被调用

void Start()

  • 脚本被绑定到物体上时调用

void Update()

  • 每一帧的时间调用一次,会因为电脑卡顿而导致调用间隔变大

void LateUpdate()

  • 在Update()执行完后调用

void FixedUpdate()

  • 固定间隔时间调用一次,不会随着电脑性能变化而变化

transform.position

  • 游戏物体在世界坐标系中的位置

transform.localPosition

  • 游戏物体相对父节点的位置

transform.eulerAngles

  • 游戏物体在世界坐标系中的旋转(欧拉角)

transform.localEulerAngles

  • 游戏物体相对父节点的旋转(欧拉角)

transform.rotation

  • 游戏物体在世界坐标系中的旋转(四元数)

transform.localRotation

  • 游戏物体相对父节点的旋转(四元数)

transform.localScale

  • 游戏物体自身的缩放

transform.up

  • 物体的上方向量

transform.forward

  • 物体的正前方向量

transform.parent

  • 父节点物体的transform

transform.localToWorldMatrix

  • 本地坐标系变换到世界坐标系的矩阵

transform.worldToLocalMatrix

  • 世界坐标系变换到本地坐标系的矩阵

transform.root

  • 层级关系中的根节点的transform组件

transform.childCount

  • 子孙节点的数量

transform.lossyScale

  • 全局缩放比例(只读)

transform.Translate(Vector3 translation , Space relativeTo = Space.Self)

  • 按指定的方向移动一个物体
  • 参数1:位移的向量;参数2:参照的坐标系(Space.Self,Space.World)

transform.Rotate(Vector3 eulers , Space relativeTo = Space.Self)

  • 按指定的欧拉角旋转物体
  • 参数1:欧拉角;参数2:参照的坐标系(Space.Self,Space.World)

transform.RotateAround(Vector3 point, Vector3 axis, float angle)

  • 一个物体围绕另一个物体旋转
  • 参数1:被围绕物体的位置坐标;参数2:轴向量;参数3:旋转的角度

transform.LookAt(Vector3 position)

  • 让物体朝向某一个位置
  • 参数1:朝向的位置坐标

transform.TransformDirection(Vector3 direction)

  • 把一个方向从局部坐标系变换到世界坐标系
  • 参数1:方向向量

transform.InverseTransformDirection(Vector3 direction)

  • 把一个方向从世界坐标系变换到局部坐标系
  • 参数1:方向向量

transform.TransformPoint(Vector3 position)

  • 把一个点从局部坐标系变换到世界坐标系

transform.InverseTransformPoint(Vector3 position)

  • 把一个点从世界坐标系变换到局部坐标系

transform.DetachChildren() 

  • 和所有子物体解除父子关系

transform.Find(string n)

  • 按名字来查找子物体,没有找到就返回null

transform.IsChildOf(Transform parent)

  • 判断自身是否是另一个对象的子物体

Quaternion.LookRotation(Vector3 forward, Vector3 upwards = Vector3.up)

  • 使游戏物体转向
  • 参数1:物体转向的向量;参数2:向上的方向向量

Vector3.MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)

  • 从当前地点移动到目标点,且每次移动的最大长度不超过maxDistanceDelta
  • 参数1:当前的位置;参数2:目标位置;参数3:每次移动时的最大长度
  • 返回值为current加上maxDistanceDelta后的位置,如果超过了target,就返回target

Vector3.Lerp(Vector3 a, Vector3 b, float t)

  • 根据t计算a到b之间的差值,t的取值范围为[0,1]
  • 当t=0时,返回值为a;当t=1时,返回值为b

Vector3.Distance(Vector3 a, Vector3 b)

  • 计算两个位置之间的距离,返回值类型为float

void OnTriggerEnter(Collider c)

  • 当有物体进入触发器时调用

void OnTriggerExit(Collider c)

  • 当有物体离开触发器时调用

void OnTriggerStay(Collider c)

  • 当有物体停留在触发器内时调用

void OnCollisionEnter(Collision c)

  • 当有物体进入碰撞器时调用

void OnCollisionExit(Collision c)

  • 当有物体离开碰撞器时调用

void OnCollisionStay(Collision c)

  • 当有物体停留在碰撞器内时调用

getComponent()

  • 获取游戏物体上type类型的控件

getComponents()

  • 获取游戏物体上所有的type类型的控件,返回Component[]

GetComponentInChildren()

  • 采用深度优先搜索,返回第一个遍历到的游戏物体和它子物体上的Type类型的控件

GetComponentsInChildren()

  • 采用深度优先搜索,遍历游戏物体和它子物体上所有的Type类型的控件,返回Component[]

GameObject.Find("GameObject/obj")

  • 根据名字或路径来查找物体对象

GameObject.FindWithTag("player")

  • 根据标签tag来查找物体对象

GameObject.FindGameObjectsWithTag("player")

  • 查找所有使用该标签tag的对象,返回GameObject[]

Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask,               QueryTriggerInteraction queryTriggerInteraction)

  • 使游戏物体发出射线,来检测碰撞体
  • 参数1:射线的初始位置向量;参数2:射线的方向
  • 参数3:包含被检测到的物体的信息;参数4:射线的最远射程;
  • 参数5:需要检测的图层;参数6:是否检测触发器

layerMask = 1<

layerMask = ~1<

LayerMask.GetMask("Player", "Default"):检测Player层和Default层

~LayerMask.GetMask("Player", "Default"):检测除Player层和Default层之外的图层

QueryTriggerInteraction.Collider:检测开启触发器的碰撞体

QueryTriggerInteraction.Ignore:不检测开启触发器的碰撞体

QueryTriggerInteraction.UseGlobal:isTrigger钩选时检测,isTrigger不钩选时不检测


协程的创建和使用

void Start(){
    //
    StartCoroutine("Fun");
    //
}


IEnumerator Fun(){
    //
    yield return new WaitForSeconds(2.0f);
    //
}
  • startCoroutine("fun"):开启协程,并转到Fun函数
  • yield return:返回到Start()函数并往下执行
  • new WaitForSeconds(2.0f):等待两秒后从其他函数再跳转到Fun函数继续执行(其他函数等待,不往下执行)
  • 协程属于单线程,来模拟多线程

WaitForFixedUpdate()

  • 在FixedUpdate()执行完后返回到协程

WaitForEndOfFrame()

  • 在一帧结束后返回到协程

WaitForSecondsRealtime(float time)

  • 等待现实时间time秒后返回到协程,不受时间缩放的影响

WaitUntil(bool fun())

  • 直到fun()函数返回值为true时,才返回到协程

WaitWhile(bool fun())

  • 与WaitUntil相反,直到fun()函数返回值为false时,才返回到协程

协程的停止

void Start(){
    //第一种写法
    StartCoroutine("Fun");
    StopCoroutine("Fun");

    //第二种写法
    IEnumerator ie = Fun();
    StartCoroutine(ie);
    StopCoroutine(ie);

    //第三种写法
    Coroutine coroutine=StartCoroutine(Fun());
    StopCoroutine(coroutine);
    
    //关闭所有协程
    StopAllCoroutines();
}

IEnumerator Fun(){
    //
    yield return new WaitForSeconds(2.0f);
    //
}
  • 调用stopCoroutine时,不能直接传入Fun(),要按以上三种写法来停止协程。

委托的创建和使用

public class Player : MonoBehaviour{
    public delegate void PlayMotify(); //创建委托的固定写法
    public event PlayMotify OnPlay;    //定义委托的一个事件
    void Play(){
        if(this.OnPlay!=null){    //判断是否有其他类接收该事件
            this.OnPlay();        //发送该事件
        }
    }
}

委托事件的接收

public class Game : MonoBehaviour{
    public Player player;    //创建Player对象
    void Start(){
        this.player.OnPlay+=Player_OnPlay; //监听player下委托的事件,并调用Player_OnPlay函数
    }

    void Player_OnPlay(){
        //触发事件后,做自己的处理
    }
}

Unity自带的委托调用

using UnityEngine.Events;
public class Player : MonoBehaviour{
    public UnityAction OnScore;  //泛型为OnScore函数参数
    void Play(){
        if(this.OnScore!=null){    //判断是否有其他类接收该事件
            this.OnScore(1);        //发送该事件
        }
    }
}

public class Game : MonoBehaviour{
    public Player player;    //创建Player对象
    void Start(){
        this.player.OnScore=GetScore; //监听player下委托的事件,并调用GetScore函数
    }

    void GetScore(int score){
        //触发事件后,做自己的处理
    }
}


Invoke(string methodName , float time)

  • 用于延迟执行指定函数
  • 参数1:要执行的函数名字;参数2:延迟time秒后执行

InvokeRepeating(string methodName , float time , float repeatRate)

  • 用于重复执行指定函数(Repeating是重复的意思)
  • 参数1:要执行的函数名字;参数2:延迟time秒后执行;参数3:每repeatRate秒执行一次指定函数
  • 执行顺序:先准备要执行的函数methodName,等待time秒执行methodName,之后每repeatRate秒执行一次该函数

Instantiate(T original , Vector3 position , Quaternion rotation)

  • 用于克隆游戏物体,返回值为该克隆体
  • 参数1:需要被克隆的对象;参数2:克隆后的位置坐标:;参数3:克隆后的旋转坐标

3D游戏物体的运动控制脚本

void Update(){
    //竖直轴 -1,0,1
    float vertical = Input.GetAxis("Vertical");
    //水平轴 -1,0,1
    float horizontal = Input.GetAxis("Horizontal");
    //方向
    Vector3 dir = new Vector3(horizontal,0,vertical);
    if(dir != Vector3.zero){
        //先转向
        transform.rotation=Quaternion.LookRotation(dir);
        //后行走
        transform.Translate(Vector3.forward * 2 * Time.deltatime);
    }
}

2D游戏物体的运动控制脚本

void Update(){
    //水平轴 -1,0,1
    float horizontal = Input.GetAxis("Horizontal");
    //往左(-1)或往右(1)
    if(horizontal!=0){
        //将x轴的缩放取反,来实现人物转向
        transform.localScale=new Vector3(horizontal>0?1:-1, 1, 1);
        //移动
        transform.Translate(Vector2.right * horizontal * Time.deltaTime);
    }
}

导航寻路脚本

//导航
private NavMeshAgent agent;
//玩家
private Transform player;

void Start(){
    agent=GetComponent();
    player=GameObject.FindWithTag("player").transform;
}
void Update(){
    float dis = Vector3.Distance(transform.position,player.position);
    if(dis>1.5f){    //与玩家距离大于1.5时,自动寻路到玩家
        agent.isStopped=false;
        agent.SetDestination(player.position);
    }else{
        agent.isStopped=true;
    }
}

相机跟随目标脚本

//跟随目标
private Transform player;
//向量:摄像机的位置减去目标位置
private Vector3 dir;
void Start(){
    player = GameObject.FindWithTag("player").transform;
    dir = transform.position-player.position;    //保证该差值不变,实现目标的跟踪
}

void Update(){
   transform.position = player.position + dir;   //更新摄像机的位置
}

AudioSource控制脚本

public class AudioManager:MonoBehaviour{
    //单例
    public static AudioManager instance;   
    //背景音乐
    public AudioSource musicPlayer;
    //音效音乐
    public AudioSource soundPlayer;

    void Start(){
        instance=this;
    }

    //播放背景音乐
    public void PlayMusic(string name){
        if(musicPlayer.isPlaying==false){
            //播放音乐片段,从资源文件中通过名字来加载音乐文件
            AudioClip clip=Resources.Load(name);
            //换碟
            musicPlayer.clip=clip;
            //播放
            musicPlayer.play();
        }
    }

    //停止播放
    public void StopMusic(){
        musicPlayer.stop();
    }

    //播放音效
    public void PlaySound(string name){
        //播放音乐片段,从资源文件中通过名字来加载音乐文件
        AudioClip clip=Resources.Load(name);
        //播放一次
        soundPlayer.PlayOneShot(clip);
    }
}

Canvas

  • Render Mode:渲染模式
  1. Screen Space - Overlay:UI显示在最前方,遮挡其它3D物体
  2. Screen Space -Camera:摄像机包含整个UI界面,和3D物体有层次关系
  3. World Space:Canvas完全变为一个3D物体,可自由调节Canvas

Canvas Scaler

  • UI Scale Mode:UI缩放模式
  1. Constant Pixel Size:UI以恒定的像素大小显示
  2. Scale With Screen Size:UI按屏幕的大小自动缩放
  3. Constant Physical Size:UI以恒定的物理尺寸显示
  • Scale With Screen Size:
  1. Reference Resolution:参考分辨率,参照UI依据的分辨率,随着分辨率的变化而自动缩放

Anchor Presets

  • 图片相对于锚点的位置是固定的。假设图片在右上角,需要将锚点选到右上方,从而达到屏幕适配的效果

Image

  • Image Type:图片样式
  1. Simple:简单模式,图片正常拉伸
  2. Slice:切分样式,可以将图片切分成多块
  3. Tiled:平铺样式,图片拉伸时,会有相同的图片显示在多余的区域
  4. Filled:填充样式,可以按特定的填充方式来显示图片

组件中的拖拽条

public class Game:MonoBehaviour{
    [Range(0,1)]
    public float value;
}
  • 在组件面板界面中显示名字为value,范围为[0,1]的拖拽条

持续学习更新......

你可能感兴趣的:(Unity3d,unity3d,游戏开发,unity)