安装Unity
组件(属性)决定了一切
场景
Perspection
近大远小
Orthographic
图形的显示与距离无关
Isometric
不论距离,一样大小
Fild 广角设定,默认 60 度
角度越大,显示越畸形,一般建议: 30 - 40 度
游戏物体
3D视图
世界坐标系
拉动坐标轴线
拉动坐标面
直接在属性面板设置(Transform里,也可以重置reset)
逆时针为正,顺时针为负
按住Ctrl键时,会增加 15度
拉动坐标轴线
拉动坐标块
在属性面板,X Y Z处可以拖动鼠标
W 移动
R 缩放
E 旋转
Q 查看
pivot 轴心模式
Center 中心模式
Global 世界坐标系
Local 局部坐标系
在层级管理器里多选,比较精准
选中物体后,Ctrl + D
选择物体后,按Shfit
1格约定为1米
3DMax 、Maya 、Blender 、Cinema4D 、ZBrush
选中物体, 按F,将物体置于视图中心
双击物体也是同样的效果
Active
存储了模型的形态数据
若干小面合围组成
模型是中空的
包含了,面、顶点坐标、面的法向等数据
任何物体都是由 三角面 组成
Shaded 着色模式,显示表面材质
Wireframe 线框模式,仅显示网格
线框着色模式
可以通过场景右上角的最大化选项查看
颜色
金属 / 非金属
光滑 / 粗糙
透明 / 半透明 / 不透明
凹陷 / 凸起
把材质拉到物体上
把材质拉到属性上
属性窗口右上角也可以锁定,以方便操作
默认材质也可以删除
也称贴图,用一张图片定义物体的表面颜色
把图片放在材料:反射率前面的小框里
选择已经放上的图片,按一下 Backspace
标准格式:FBX
子主题2
没有厚度
背面不会被渲染
材质的重映射
使用外部材质旧,然后直接修改材质
直接拖到层级窗口
贴图文件放在同目录下
放在同目录的 Textrues
只使用FBX的网格、或是材质
Aseets 下的是资源主文件夹
.meta 描述主文件,尽量不要删除
可以把选择中的资源导出
子节点跟着父节点移动
父物体删除后,子物体也被删除
子物体的坐标,是相对于父物体的
空物体不可见,没网格,有坐标,可移动
作为了一个父节点进行组织和管理
标记一个位置,(空节点)
比如:空气墙
up
foward
right
6个方向,上下,东南,西北
6个方向,上下,左右,前后
子主题1
一般来主并不在几何中心,但也有可能
轴心的位置是由建模软件定的,只能在建模时设置
Component 代表了了一个功能
光源
网格过滤器
网络渲染器
Audio Source
AudioClip
Toggle Audio On
位置,相对坐标于父坐标,如果没有父坐标,就是世界坐标
旋转,欧拉角
缩放
此组件不能被删除
摄像机的Z轴指向为拍摄方向
Game窗口的内容,为玩家最终所见
选好位置后,叫摄像过来按这个角度拍摄
手动调整角度
脚本名与类名一致,否则无法导入
命名规范,等同于C#的类,Pascal标准,首字母大写,非中文
不加载的脚本是无效的
游戏窗口或控制窗口显示结果
点某物体的 Add Component > Script > 选择:脚本文件
把脚本直接拉到物体的组件栏最下边
编译是自动的,Ctrl + S 保存后。Unity会自动编译
UnityEngine
MonoBehaviour
GameObject
Transform
Vector3
transform.position
经常使用
this.GameObject.transform.position
this.transform.position
this.transform.localposition=new Vector(1.2f ,2.2f , 0)
浮点类型,数字后掇必须加: f
可实时编辑,获得实时数据
编辑的数据不会被保存
编辑模式
一个游戏帧
帧率 / 刷新率
每秒多少帧
帧更新,会被游戏引擎定时调用,以更新游戏状态
可以通过在Update中添加 log函数,在Console中观察变化
帧更新的频率是不固定的,但unity会尽快的更新
Application.targetFrameRate=60 Unity尽量按 60FPS来进行更新,但不承诺
游戏时间,从游戏启动开始计算的时间
距上次更新的时间差
Vector3 pos=this.transform.position; float speed = 3; float distance = speed * Time.deltaTime; pos.x = +distance; this.transform.position = pos;
GameObject.Find(" name_or_path ") 根据名称 / 路径 , 查找物体
Transform.LookAt( 目标物.transform ) 使物体的 Z 轴朝向目标物
按自身的坐标向移动
float speed = 1; float distance = speed * Time.deltaTime; this.transform.Translate(0, 0, distance);
Translate(x,y , z , Space.Self // Space.Wrold )
Space.Self 更常用,沿自己的前后左右移动
建模的时候,物体前方,应与: Z 轴 一致
Application.targetFrameRate = 60; Vector3 pos = this.transform.localEulerAngles; pos.y += 30f * Time.deltaTime; this.transform.localEulerAngles = pos;
通过2个空节点来建立自动+公转
地球
月球
transform.Rotate(x,y,z,Space.Self);
同一步脚本可以多次使用
初始化,仅执行一次
Sart()、Update()方法不会执行
初始化,仅执行一次
先于start
即便组件被禁止,也要调用
帧更新,每帧调用一次
每当组件启用时调用
每当组件禁用时调用
所有组件的 Awake
所有组件的 Start
所有组件的 Update
脚本默认都是 0 级优先,不确定的
excution order
除非特殊需要,一般不设置
游戏的主控逻辑
游戏帧率等
MainLogic
数据可以放在 Awake里
手动调用优先级
必须是 public
首字母小写,第二字母大写 系统会自动分割
reset
可以用:[ Tooltip () ] 提示
[ Tooltip ( " 旋转速度 " ) ]
如果用户重新赋值,就会有使用新值
int 、float 、bool 、Vector3 、Color 、结构体
本身是值,可以直接赋值
默认值为0
不能赋: null
Class 、GameObject 、MeshReaderer 、Transform
节点、组件、数组、资源
装数据的窗口、模板等,都是引用类型
组件:Copy Component
组件:Paste Component Values
键盘
鼠标
Touch
摇杆
所有的调用,在Update函数之后发生
鼠标位置信息,返回Vector3o数值
Input.GetMouseButtonUP ( 0 ) 鼠标抬起事件
Input.GetMouseButtonDown ( 0 ) 鼠标按下事件
此事件应该写在 Update()中,别的地方没有实际意义
Input.GetMouseButton( 0 ) 检测鼠标状态
0:左键,1:右键,2:中键,bool值
鼠标按下后,所有脚本都检测到,都会按自己的脚本进行处理
子主题1
You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.
点击Edit->Project Settings...->Player->Other settings,将active lnput handling选项设置为Both。即可解决问题。
AudioSource audio = this.GetComponent() 音频资源
audio.mute = true;
是否循环播放
音量
public AudioSource bgm;
组件里拖拽进对应的属性栏里
public FanLogic fan;
fan.rotateSpeed=180;
fanNode.SendMessage(" 要執行的函數名 ")
如果函数名出错,会报错
1、螺旋桨是直升机的子物体。
2、螺旋桨、直升机主体的脚本分别与本物体绑定
3、主控脚本里,建2个物体脚本的类名类型的变量
4、 通过脚本类名.子物体.方法()来控制
游戏物体,节点,GameObject
GameObject 是个静态的方法
public GameObject node2;
Hc_Rotate hc_Fly = node2.GetComponent();
此种方式在物体变换名称后,依然能够访问
GameObject node=GameObject.Find(" 物体名 ")
GameObject node=GameObject.Find(" 文件夹名/物体名 ")
执行效率低,容易出错
父子级关系,是由Tranform维持的
Transform ts = this.transform.parent;
GameObject parentNode = this.transform.parent.gameObject;
foreach (Transform child in transform) { child.position += Vector3.up * 2f; } 只查子节点,孙节点不查
Transform child2= this.transform.GetChild(0); Debug.Log("** 方式一:0下标的子节点名为:" + child2.name);
Transform child3 = this.transform.Find("Test/Test3"); Debug.Log("** 方式三:通过名字的方式:" + child3.name); " Test/Test3 " 说明是孙节点
Transform trs = this.transform.Find("/GameMain"); this.transform.SetParent(trs); /GameMain //寻找根节点下的
this.transform.SetParent(null); 设置为父级节点
Transform ccc = this.transform.Find("2"); if (ccc.gameObject.activeSelf) { ccc.gameObject.SetActive(false); } else { ccc.gameObject.SetActive(true); } 脚本必须挂在父级节点,2为子节点
注意代码输入的大小写
命名空间下
Application.targetFrameRate = 60; star()里
if (Input.GetKeyDown(KeyCode.Space)) { ChangeShape(); } star()里
/// 1、隐藏掉第一个 Transform child = this.transform.GetChild(index); child.gameObject.SetActive(false); /// 2、用于循环方块体形状 index++; int count=transform.childCount; if (index>=count) { index = 0; } /// 3、变形:先取到新物体,然后显示 child = this.transform.GetChild(index); child.gameObject.SetActive(true); 自定义函数
添加空C#脚本挂到某物体下,并给物体添加AudioSource组件
命名空间下添加音乐变量: public AudioClip aduioSource_Name;
命名空间下添加音乐数组变量: public AudioClip [ ] aduioSource_Songs;
在unity界面,把音乐资源拉到:脚本下的参数栏中,进行资源加载
if (Input.GetKeyDown(KeyCode.A)) { AudioSource aduioSource = this.GetComponent(); aduioSource.PlayOneShot(aduioSource_Name); } if (Input.GetKeyDown(KeyCode.M)) { Play(); } Update()里
void Play() { /// 设置一个随机播放函数 int index= Random.Range(0, Music.Length); AudioClip clip = this.Music[index]; /// 添加音乐播放组件,并把随机下标的音乐文件赋值给组件 AudioSource ac = this.GetComponent(); ac.clip = this.Music[index]; ac.Play(); /// 显示插入信息 Debug.Log("现在播放是的:" + index + "名称是:" + clip.name); } 自定义函数
index=Random.Rang ( minx , max ); 不包含 max
public AudioClip [ ] arraryName;
public Material[] Colos; int index;
在unity界面绑定材质
if (Input.GetKeyDown(KeyCode.A)) { Change(); } Star()
public void Change() { /// 下一个索引号 index++; if (index >= this.Colos.Length) { /// 如果到了最后一个,再回到第一个 index = 0; } /// 给指定下标的材质 Material select = this.Colos[index]; /// 取出(激活)组件 MeshRenderer mr = GetComponent(); /// 给组件下的属性赋值 mr.material = select; } 自定义函数
2秒后执行 1 次
InvokeRepeating(“函数名”,2,3) 首次2秒执行 1 次,后续 每 3 秒循环执行 1 次
是否调用中
取消调用
Inovke并没有调用新线程
unity的核心单线程的
子主题2