Unity3d笔记2

Transform

Transform->reset 重置物体的位置、旋转角度、大小

Ctrl+D 复制一个组件

Ctrl+方向键 按照步移移动

之前是通过施加力的方式控制组件移动

也可以通过transform.Translate(Vector3(x,y,z));改变组件的位置

但是当transform.Translate(Vector3(x,y,z))放在update()时,会发现移动的非常快

通过组件控制物体

组件

组件实体具有被挂载的性质,即可以用任何一个组件指代游戏物体本身

访问组件

游戏物体上挂载的组件就是一个组件实例(Component Instance),或者叫组件对象(Component Object)

GetComponent函数用于获取另一个组件对象,通常会用一个变量保存组件对象的引用变量;

可以通过引用变量实现组件对象所支持的操作,如获取刚体的质量;

通过刚体组件的引用变量还可以调用Rigidbady的AddForce;

脚本组件也是组件,所以也可以用GetComponent获得,要获得脚本组件,组件名就是脚本的类名;

获取一个不存在的组件名函数会返回null(空引用),如果去操作,null就会引发运行异常

void start(){
    // 刚体组件
    Rigidbody rb = GetComponent<Rigidbody>();
    
    //改变物体质量为10千克
    rb.mass=10f;

    // 施加一个力大小为10牛顿
    rb.AddForce(Vector3.up * 10f);    
}

访问其他游戏物体

在实际开发中,一个脚本不仅会对当前挂载的物体进行操作,还可能会引用其他物体

正在追逐玩家角色的敌人角色会一直保留这对玩家对象的引用,以便随时确定玩家的位置

用变量引用游戏物体

为脚本添加一个public GameObject变量,不需要设置初始值;

变量会显示在检视窗口,默认值为None;

将物体或预制体拖曳到变量的文本框里赋予初始值;

引用其他物体时,变量类型不仅可以是GameObject或者一个组件,也可以将具有该组件的游戏物体拖曳到这个变量上;

可以用一个数组或列表保存多个游戏物体

public class test : MonoBehaviour
{
    public GameObject player;
    void Start()
    {
        // 读取player的位置,并设置本物体的位置在他后方
        transform.position = player.transform.position - Vector3.forward * 10f;
    }
}

查找子物体

(1) 用父物体的变换组件查找子物体;

(2) 使用transform.Find方法查找某个子物体,如第7行注释;

using UnityEngine;

public class WaypointManager : MonoBehaviour{
    public Transform[] waypoints;

    void Start(){
        // transform.Find("Gun");
        waypoints = new Transform[transform.childCount];
        int i = 0;
        //用foreach循环访问所有子物体
        foreach (Transform t in transform){
            waypoints[i++] = t;
        }
    }
}

通过标签或名称查找物体

(1)GameObject.Find方法通过名称查找物体,string参数指定名称

(2)GameObject.FindWithTag或GameObject.FindGameObjectWithTag方法通过标签查找物体

常用事件函数

基本更新事件

Update 每一帧被调用,按帧执行的逻辑放在这里

FixedUpdate 固定更新,专用于物理系统,保证稳定性

LateUpdate 每一帧游戏逻辑的最后,渲染之前被调用,如用于更新摄像头的位置

void LateUpdate(){
    //在帧的最后阶段,将摄像头转向玩家角色的位置。这样摄像机的旋转会更流畅
    Camera.main.transform.LookAt(target.tranform)
}

初始化事件

start update第一次被调用前调用

Awake 游戏实例被载入的时候调用

时间和帧率

游戏移动时通过乘以Time.deltaTime的运算,物体的移动不再以“每帧距离”为准,而变成了每秒距离,以达到从时间上看起来匀速的效果

使用Time.fixedDeltaTime可以获取物理更新间隔,默认值为0.02,可以修改

其他事件

除了以上事件还有已知的46个事件,如OnTriggerXXXX、OnCollisionXXXX、OnEnable等

创建和摧毁物体

Instantiate(GameObject gameObject) 通过gameObject创建物体,gameObject通常为预制体

Destroy(GameObject gameObject, float s) 在s秒后摧毁游戏物体gameObject

Destroy也可以用于移除挂载的组件

脚本组件的生命周期

继承MonoBehavior的脚本表示需要作为组件使用,能够挂载到物体上,且能够处理Unity的事件

脚本组件的生命周期经过初始化(Awake, Start等)、编辑器、物理(FixedUpdate, OnTriggerXXXX, OnCollisionXXXX等)、输入(OnMouse)、游戏逻辑(Update, Latedate)、场景渲染、辅助线框渲染、GUI渲染、帧结束、暂停和析构几个步骤

标签

用于查找和指定物体

可以为物体设置标签

可以创建新的标签

标签被创建后不能修改,只能删除重新创建

一个游戏物体只能被指定一个标签

unity预制的标签:Untagged(没有标签)、Respawn(出生)、Filish(完成)、EdiorOnly(编辑器专用)、MainCamera(主摄像机)、Player(玩家)、GameController(游戏控制器)

静态物体

在检视菜单中,每个物体名称的右侧都有一个静态复选框(static)以及一个菜单用来指定一个物体是否是静态的;静态标志菜单可以有针对性地设置物体在每个子系统中是否是静态的

静态菜单中的子系统包含如下内容

  • Lightmap Static:场景中的高级光照特性

  • Occlude Static:根据物体在特定摄像头下的可见性,进行渲染优化

  • Batching Static:将多个物体合为一个整体进行渲染

  • Navigation Static:在寻路系统中的网格链接

  • Off Mesh Link Generation:寻路系统中的网格链接

  • Reflection Probe Static:反射探针优化

可以在相关文档中阅读他们的细节

层级

用于让摄像机仅渲染场景中的一部分物体;

用于让灯光只照亮一部分物体;

用于碰撞检测、射线检测;

可以新建层级

可以为物体指定层级

仅渲染场景的一部分

层级配合摄像机的剔除遮罩(Culling Mask)使用,可以有选择性的显示某些层级的物体

unity许多下拉菜单中,Nothing表示所有选项都会被取消勾选,Everything 所有选项都会勾选

当UI系统采用屏幕空间画布,则不会受到摄像机剔除遮罩的影响

选择性的射线检测

使用层级可以让射线检测忽略某些碰撞体

有时需要发射一条射线,仅和Player层的物体发生碰撞,而忽略其他物体

Physics.Racast 方法用来发射一条射线,可以携带参数layerMask

  • layerMask是一个利用位标记作为遮罩的参数

  • 用位作为标记是二进制相关的方法,原理是int型的变量由32个位组成,每个位只能是0或1,因此可以根据某个位是0还是1来选中或者忽略某一层

  • 如果layerMask所有的位都是1,那么就会和所有层发生碰撞;如果layerMask等于0,那么他就不会和任何层发生碰撞

// 将1左移一位
int layerMask = 1 << 8;
// 将layerMask设置为只有从右数第8为是1,其余位是0,则只会和Layer 8 Player层发生碰撞
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    Debug.Log("The ray hit the player");

如果是玩家的游戏人物发出的检测射线,反之,需要和除玩家的游戏人物以外的所有物体发生碰撞

void CameraRot()
{
    if(CanContrl)
    {
        //dian
    }
}

猜你喜欢

转载自blog.csdn.net/qq_51943845/article/details/129309720