Unity3D学习笔记一:Unity简介、游戏物体、组件和生命周期函数

 

Project(工程、项目):工程是把游戏开发当前所需要的资源归类管理用的。

Console控制台:日志、报错、调试,右上角,消息过滤

Assets:资源,存储游戏中一切用到的资源 Library:临时库文件 ProjectSettings:项目设置、项目控制 Temp:临时文件夹 UnityPackageManager:资源包

工程迁移: Assets、ProjectSettings、UnityPackageManager,这三个文件夹必须拷贝走 如果报错,先删掉Library和Temp,再重新打开Unity dependencies关联资源,引用资源

project面板:管理所有项目资源和文件 Inspector:当前选中游戏物体细节   程序=数据结构+算法 数据结构:存储数据的结构,栈、堆、链 List的核心是数组,   .unity后缀名:场景文件 .unitypackage后缀名:资源包   偏好设置 MonoDevelop:微软出品,早年为了实现跨平台(Mac),后来VS2017支持Mac

  组件的概念:将一些具有功能性的代码封装起来,封装成一个类,当这个类挂到游戏物体身上去的时候,就相当于对此类的实例化,变成了具有这个功能的对象实体,那么这个游戏物体也就具有了这个对象所具有的功能。 组件的挂载相当于创建对象,添加功能性的对象。 游戏物体: 从表现层来看:场景视图中或者层级视图中能被看到的或者能被选中的都叫游戏物体。 从面向对象的角度来看:游戏物体是一个或者多个组件的集合。 Transform是基本组件,即使GameObject空物体也要有基本组件。坐标系,朝向,形体, Position:单位米 Rotation:单位Unity(欧拉角,角度)和C#(四元素,弧度) 右手坐标系(数学运算)和左手坐标系(几何变换):拇指X轴右,食指Y轴上,中指Z轴前 Scale:单位倍数 Reset:重置还原  
MonoBehaviour:是每个脚本派生的类的基类。
Start、Updata(生命周期函数、事件函数):在特定的时间点被游戏引擎被动调用的函数叫做生命周期函数。
Unity分为编辑内存和运行内存
第一步实例化所有游戏物体的组件
第二步激活所有游戏物体的组件
Awake():在此组件被实例化的时候执行一次
OnEnable():在此组件被激活的时候执行一次
OnDisable():在此组件被失活的时候执行一次
Start():在此组件对象第一次被激活的时候执行一次(在游戏开始的时候被执行一次,用来初始化)
Updata():每一画面刷新帧被调用一次(在游戏物体和脚本组件被激活的情况下)
FixedUpdate():每一物理帧更新刷新一次(物理帧是固定帧0.02秒)
LateUpdate():每一画面刷新帧被调用一次,只不过比Updata要晚(常用于摄像机跟随,防抖)OnDestroy():在此组件被销毁(remove)的时候执行一次(游戏运行时,在运行内存中销毁,编辑内存仍在)
帧(Frame):屏幕刷新的表示方式
帧率(FPS):帧率 = 帧数 / 时间 (单位时间内画面刷新的帧数)
肉眼:24
手游:30~60
PC/主机游戏:60~120
VR:120以上

collapse折叠调用,显示调用次数

整个游戏物体的激活与失活,游戏物体被激活失活时,会同步激活失活游戏物体的组件

单个物体组件的激活与失活

Mesh网格,正方形4个顶点2个三角面,平面10x10米,面片1x1米

Snap settings 吸附

给物体添加图标

 

Unity3D 快捷键
当前轴心旋转:Alt+鼠标左键
移动场景:鼠标滚轮键 / Q
缩放场景:使用鼠标滚轮键 / Alt+鼠标右键
居中所选物:F
飞行浏览:鼠标右键+WSAD(按Shift加速),QE上下
Edit菜单
播放:Ctrl+P,暂停:Ctrl+Shift+P,单帧预览:Ctrl+Alt+P
Assets菜单
刷新:Ctrl+R
GameObject菜单
新建空对象:Ctrl+Shift+N,移动物体到视图中心点:Ctrl+Alt+F,移动物体与视图对齐:Ctrl+Shift+F
Component菜单
添加组件:Ctrl+Shift+A
近距离查看游戏对象
在Hierarchy视图中选择游戏对象,然后在Scene视图中按快捷键“F”来近距离查看该游戏对象。
游戏对象不在主摄像头中
Hierarchy中双击选择需要显示的游戏对象,再单击Main Camera选中,最后Ctrl+Shift+F键盘即可。
旋转视图
Alt键 + 鼠标左键 可以任意拖动鼠标来旋转视图。如果x,y,z坐标轴恢复不了,可以先单击X轴(Y、Z)再鼠标右键选择“Free” 最后通过这个来调试。
缩放视图:滚动鼠标中键可以缩放整体视图。
变换工具栏:拖动工具:Q 移动工具:W 旋转工具: E 缩放工具:R
按住Ctrl键移动物体会以一定的增量来移动物体
Edit-Snap Setting 栅格和捕捉设置
Ctrl+Shift 使物体在另一个物体上移动,物体在被相交的物体上移动
顶点吸附 选中物体,按键盘V键 就可以看到物体的顶点:可以快速使两个物体定位
关闭顶点吸附:Shift+V

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//类和结构都需要被序列化后,才可以在检视面板显示
public class Student
{
    public string name;
    public int age;
    public override string ToString()
    {
        return string.Format("[name:{0},age:{1}]",name ,age);
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Unity1803 : IEnumerable
{
    List<Student> students;//我没有加public,老师加了public
    public Unity1803()
    {
        students = new List<Student>()
        {
            new Student() { name = "张三",age= 20},
            new Student() { name = "李四",age= 18},
            new Student() { name = "王二",age= 22},
            new Student() { name = "赵六",age= 21},
            new Student() { name = "田七",age= 20},
        };
    }
    public IEnumerator GetEnumerator()
    {
        //返回的对象 必须实现了IEnumerator接口
        Unity1803IEnumerator ie = new Unity1803IEnumerator(students);
        return ie;
        //简便写法
        //yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能。
        //for (int i = 0; i < students.Count; i++)
        //{
        //    yield return students[i];
        //}
    }
    public class Unity1803IEnumerator : IEnumerator
    {
        List<Student> students;
        int index = -1;
        public Unity1803IEnumerator(List<Student> students)
        {
            this.students = students;
        }
        public object Current
        {
            get
            {
                return students[index];
            }
        }
        //是否移出了集合的范围 返回true 表示当前的指针还在范围内 false则是在范围外
        public bool MoveNext()
        {
            index++;
            return index < students.Count;
        }
        public void Reset()
        {
            index = -1;
        }
    }
}

 

Unity复习 UnityEngine.Object是System.Object的子类,Unity默认继承UnityEngine.Object,C#默认继承System.Object 组件挂载的要求 1、继承MonoBehaviour类 2、文件名与类名一致 3、挂载时,所有脚本代码没有编译错误 4、挂载的脚本不能是抽象类  
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//类和结构都需要被序列化后,才可以在检视面板显示
public class Enemy
{
    public string name;
    public int atk;
    public int hp;
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum EEnemyType
{
战士,
法师
}
public class NewBehaviourScript : MonoBehaviour
{
    //以检视面板为准
    public int intNum = 0;
    //私有变量不会在检视面板显示
    //特性:[]标签的形式
    //可以把私有的字段在检视面板中显示出来
    [SerializeField]//序列化字段 Attribute 反射(程序集.exe .all)
    private float floatNum = 0.0f;
    [Multiline(4)]//让字符串多行显示
    public string str = "";
    [Header("战士的类型")]//说明文本
    public EEnemyType enemyType = EEnemyType.战士;
    [Header("XX的数量")]
    public int[] nums;
    [Header("XX的数量")]
    public List<int> listArray;
    public Student student;
    public List<Enemy> enemyList;
    public Enemy enemy = new Enemy();
    public Unity1803 unity = new Unity1803();
    private void Awake()
    {
        //Debug.LogFormat("Int :{0}", intNum);
        //Debug.Log("Float :" + floatNum);
        //Debug.Log("Str : " + str);
        //Debug.Log("EnemyType :" + enemyType);
        ////Debug.Log("Awake");
        ////Debug.LogWarning("Awake");
        ////Debug.LogError("Awake");
        //foreach (var item in nums)
        //{
        //    Debug.Log("item :" + item);
        //}
    }
    private void OnEnable()
    {
        Debug.Log("this is OnEnable");
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("this is Start");//输出
        // 挂载的条件
        // 1. 继承  MonoBehaviour
        // 2. 文件名与类名相同
        // 3. 挂载时,所有的代码无编译错误
        // 4. 挂载的脚本不能是抽象类
        int num = Random.Range(1,55);
        Debug.Log(num);
        int[] nums = new int[] { 1, 2, 3, 5, 7, 8, 9 };
        List<int> list = new List<int>() {11,22,33,66,7,88,9 };
        foreach (var item in nums)
        {
            Debug.Log("item:" + item);
        }
        foreach (var item in list)
        {
            Debug.Log("item:" + item);
        }
        //IEnumerable 枚举器:其实就是一种机制,具有可以逐个访问某个集合每个元素的功能 {a,b,c,d}
        //IEnumerator 迭代器:实现了上面这种机制的具体的 (一个或多个)方法
        Unity1803 unity = new Unity1803();
        foreach (var item in unity)
        {
            Debug.Log("item:" + item);
        }
    }
    // Update is called once per frame
    void Update()
    {
        Debug.Log("this is Update");
    }
    private void FixedUpdate()
    {
        Debug.Log("this is FixedUpdate");
    }
    private void LateUpdate()
    {
        Debug.Log("this is LateUpdate");
    }
    private void OnDisable()
    {
        Debug.Log("this is OnDisable");
    }
    private void OnDestroy()
    {
        Debug.Log("this is OnDestroy");
    }
}

 

 

OnPreCull: 在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。
OnBecameVisible/OnBecameInvisible: 在对象对于相机可见/不可见时调用此函数。
OnWillRenderObject: 如果对象可见,则为每个相机调用一次此函数。
OnPreRender: 在相机开始渲染场景之前调用此函数。
OnRenderObject: 在完成所有常规场景渲染后调用此函数。此时,可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
OnPostRender: 在相机完成场景渲染后调用此函数。
OnRenderImage(仅限专业版): 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理。
OnGUI: 在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard/鼠标事件。
OnDrawGizmos: 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。

 

原文地址:https://www.cnblogs.com/ciaowoo/p/10362670.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先