Unity基础

设置

ProjectSetting->Edit->Enter Play Mode Options运行项目免去加载时间:

File->build Setting ->查看场景标识符

FIle->build settind->player setting->build

file->new scene创建新场景,ctrl+s保存

inspector右上...3个点,normal常规模式,debug调试模式(可以查看private变量)

Game窗口右上,player……Maximized游戏窗口

window->layout

window->packageManager->'+'加号->install package by name->install

game窗口分辨率,选择HD即高清

inspector面板右上的🔒,可以锁定当前面板,以便方便操作,点击hierarchy其他对象时不会改变面板

插件下载⚙️

插件:别人写好的cs文件,直接调用接口完成功能

对于资源,首先在Asset Store添加,然后对于项目用到的需要,Window->Package Manage ->选择My Assest->搜索名称并下载Download->Import导入到项目

1️⃣ DOTween :https://reurl.cc/WrWYRDPlugins/DoTween,平滑过渡效果(变换,颜色等)

2️⃣ Timers Manager: https://reurl.cc/M0Dm4LSmart Timers Manager计时器

3️⃣ Spawn Mega:https://reurl.cc/vdXb0y生成,添加spawn mega组件

4️⃣ Free Music: https://reurl.cc/j1p4WDMusic Tracks音乐

5️⃣ Game SFX:https://reurl.cc/RrD7qg音效

6️⃣ Dragon Warrior: https://reurl.cc/vdXbaysprite图像

7️⃣ Zombie:https://reurl.cc/KbDzlM

8️⃣ Wooden GUI: https://reurl.cc/e3abyQ

9️⃣ Background:https://reurl.cc/6QerQd

cinemachine插件

负责创建复杂相机的插件

首先右键创建虚拟相机virtual camera

对于cinemachine virtual camera组件的body,ani选择do nothing

对于position.z设置为-1

noise->basic muiti channel perlin->6D shake / 6D wobble

amplitude gain控制晃动的幅度

Input System插件:

设置输入管理系统:ProjectSetting->Player-》Active input Handling->Both允许你选择项目的输入处理系统,选择“Both”意味着你的项目将同时支持旧的输入管理系统(Input Manager)和新的输入系统(Input System Package)

Window->Package Manage ->Unity Registry->Input System插件

创建Player Input组件,调整Behavior ->invoke unity events,事件与挂载的脚本函数绑定

事件是发布(事件)订阅(事件)系统,订阅事件就是绑定自定义行为,发布就是调用事件,即执行与事件绑定的自定义行为

Unity_c#API:

脚本挂载到引擎obj上,创建类实例(对象)

var变量类型,相当于c++的auto

特性

[System.Serializable]将私有/ 非继承MonoBehaviour类的 显示到引擎上

[HideInInspector]隐藏

属性:

属性访问器get{},set{}允许类控制对其内部数据的访问

生命周期函数()

对于非继承自MonoBehaviour单一行为的类不存在生命周期函数,并且不会在引擎显示

awake在对象每次被setactive激活调用

引用图片
调试

Debug.Log();

生成

Instantiate(gameobject,position,rotatioin, Transform parentObj)生成对象

重载版:Instantiate(gameobject,Transform parentObj)

销毁

Destroy(gameobject)

触发
public Vector2 Position/* 属性(Property) */
{
    get { return playerTransform.position; }
}

void OnCollisionEnter2D(Collider2D col)当刚体发生碰撞(需要其中之一有刚体,都有碰撞体才会触发)

void OnTriggerEnter2D(Collider2D col)当刚体发生碰撞 ,Collider2D是被撞击的obj,需要彼此都有碰撞体

physics

Physics2D.OverlapCircleNonAlloc(圆心,半径,Collider2D[]结果)以什么为圆心获取周围的物体

Quaternion

Quaternion.LookRotation(绕什么轴,旋转到什么方向)

Quaternion.identity就是 new Quaternion(0f, 0f, 0f, 1f);

transform.rotation = Quaternion.Euler(0, 0, 0)旋转角度

Find

unity查找方式

.CompareTag("")查找标签

FindObjectOfType<……>()

.GetComponent<>();获取组件 

UnityEvent

UnityEvent<type,……>(<>可省略,内部为在事件中传递的数据)创建事件,type是参数类型,.Invoke(参数……)执行事件,

对于具有<>的,我们在引擎要选择无(参数)的版本

TimersManager

TimersManager.SetTimer(this,time, fun);;插件的 设置计时器,在time时间后执行fun函数

TimersManager.SetLoopableTimer(this,time,fun); 设置循环计时器,在time时间执行一次

Time

Time.timeScale = 0;暂停 =1继续

(注意:要在世界添加time manager脚本)

SceneManager

SceneManager.LoadScene(场景标识符)

animator

直接播放:

animator.Play(string)

通过参数控制动画过渡:

animator.SetBool(string, bool);

animatot.SetInteger(string, int);

检查动画状态:

AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(int);

stateinfo.IsName(string)->返回bool

rigidbody

rigidbody.velocity设置刚体速度矢量,不需要考虑FPS,内置会自动计算

Transform

transform.position获取自身this的变换组件的位置

transform.localScale获取自身this的变换组件的缩放

vector

vector.MoveTowards(起始,终点,速度)

vector.one通常将数值转为矢量

vector.zero通常作为判断条件

.Normalize()正规化

Vector3.Distance(……,……)返回float距离

Vector3.Lerp(自身,目标,速度)插值:用于过渡效果

random

Random.Range()

gameobject

gameObject.SetActive(bool)

gameObject.activeSelf是bool值,返回是否处于active激活状态

input

Input.GetAxisRaw(string)返回原始输入,string要和name完全对应

Input.GetAxis(string)返回值是经过平滑处理的

比如:按wasd会让相应的轴变为-1或1

input.GetKeyDown(KeyCode.……)当按下

input.GetKeyUp(KeyCode.……)当松开按键

Input.mousePosition获取鼠标当前位置

audio

audio source.stop()

audioSource.PlayOneShot(AudioClip)播放音效

LIst

List<Type>

list.Add();

list.RemoveAt()

.Count

mathf

Math.Abs()绝对值

Mathf.RoundToInt将浮点数四舍五入到最接近的整数。

Mathf.CeilToInt 方法用于将浮点数向上取整到大于或等于该浮点数的最小整数

组件component

collider

is trigger其他物体可以进入

Rigid body2d

物理组件刚体Rigid body2d中gravityscale重力0--1,

constraints->freeze position /rotation 冻结位移/旋转

body type->kinematic没有物理数据, dynamic有物理数据,static静态

Canvas

render mode:覆盖,摄像机,世界

子物体必须以画布为父物体才会显示

canvas Scaler

UI scales mode缩放模式(是否跟随屏幕大小)->constant pixel size 常规像素大小,->scale with screen size跟随屏幕大小

renference resolution像素参考标准(设置大小)

image

image->pixels per unit Muitipiler像素增加器,可以增加厚度模拟

button

normal常规,highlighted覆盖,press按下,selected选择,disabied禁用,颜色

silder

仅保留fill area-》子集fill,在silder.target graphic选中fill

设置anchors,pivot,position

unity内置bug:当按ctrl z 或者调整silder的宽高时fill消失,重新设置target graphic或者重新调整anchors

silder->interactable可交互(取消勾选)

silder有value,min/max, value的值在minmax之间,控制填充

在图片等直接按delete,简单的设置为空

在控制silder的value时,fill并没有填充满,因此:

  • 首先将background ,fill area和fill的anchors都设置右下填充
  • 然后rest transform归0 

我们可以选中scene视图的rect tool工具调整silder大小

sprite renderer

控制图形渲染

collider

is trigger是否可以穿透

flip面向方向

sorting layer所在层级,新建层级在引擎的右上,可以拖放改变层级顺序

order in layer层级索引,层级值越高,越后被渲染,显示在前面

audio source,AudioClip

无法播放声音,可能是game的声音图标设置为关,或者没有audio listener组件

playe on awake开始时播放

loop循环

Animation动画

window->animation->animation打开面板

选中要为其创建动画的物体(会自动为物体创建animator)->create一个动画

再次创建create new clip剪辑

当创建首个动画,会自动在选中物体创建animator

animator动画状态机

controller状态机,.controller文件,如果非通过animation创建的animator,controller默认为空,

双击.controller文件打开animator面板,或者window->animation->animator打开面板

 state属性:

  • 参考
  • loop time如果没有下个状态切换,直接停止动作
  • Mirror可以反转当前动画

state默认状态:

  • Entry状态:默认情况下播放的动画
  • Any State状态:任何状态下都有可能切换到的State
  • Exit状态:出口状态(通常在动画layer层使用)

Transitions过渡关系:

  • 右击state节点选择make transition创建过渡
  • 左侧的parameter面板创建参数
    • float / int可以控制可以量化的属性,比如速度(走步,跑步,冲刺……)
    • bool通常负责需要来回转换,比如isMoveing到idle
    • Trigger触发器默认为false,且当程序设置为true后,它会自动变回false
      • 注意要勾选has exit time,让动画播放完(蓝色为播放,灰色为非播放)
  • 点击过渡的condition创建过渡条件
  • has exit time表示在该动作完成后才允许切换
  • transition duration过渡时间
  • Can Transition To Self:不然动画会出现抖动
  • Dubug调式:在运行时选中obj,就可以看到animator中的执行
camera

内置渲染管线下camera组件介绍https://blog.youkuaiyun.com/enternalstar/article/details/118818159

input

内置输入系统

project setting->input manager,负责接收用户输入,name为别名,button,Axis轴

FPS:

在game游戏窗口的free aspect中勾选VSync,当开启会减少帧率

在game游戏窗口的stats中查看FPS帧率(每毫秒多少画面)

假设当我们一直按下移动键,每帧调用Update(),*GetAxisRaw()固定值,每个玩家帧率都不同,因此每个玩家的位移都不同

那么如何才能让每个玩家在相同时间相同输入不同帧率下位移相同呢?

*Time.deltaTime时差 == 1 / FPS,帧率越高,时差越小,帧率越低,时差越大

对角问题

还有一个问题,当我们同时按下比如wd时,会发现移动明显加快,这是因为向量相加结果为对角向量位置,它比任意一方向移动都要长,

解决方式.Normalize()正规化,这样就可以让对角方向向量正规化为1,

particle system

looping是否循环

start delay开始延迟时间

start Lifetime生命周期

Stat size开始大小

start color->右边箭头random between Two color两个颜色之间的随机

simulation space如果旋转world可以制作追尾效果

Emission->rate over time随时间变化的速率

Shape->shap发射区域形状

size over lifetime大小随时间

color over lifetime颜色随时间

mask_GUI

首先创建canvas,创建(mask)带有画布子物体的rect 和 canvas renderer组件,被遮罩的image作为子物体

3种遮罩:

  • make        
    • mask需要有image组件,并设置mask图片(仅显示图片的形状,图片外不显示)
    • show make graphic是否启用遮罩
  • rect make 2D方形遮罩
    • 不需要image组件
    • padding设置上下左右填充范围
    • softness软化边缘范围
  • sprite make
    • 对sprite对象遮罩
    • 设置sprite make的sprite遮罩形状,调整alpha边缘软化

引用,拷贝

c#有明确的值类型(发生拷贝):包括 structintfloatdoublebool 以及一些其他基本数据类型

引用类型:包括 classinterfacedelegatearray 以及字符串(string

比如public EnemyDamage enemyDamage;当EnemyDamage为class时作为类引用

而c++:

public:

EnemyDamage enemyDamage;创建类对象,一个新的内存地址

Fonts

.ttf格式的字体文件

右击文件textMeshPro->font asset 即可创建可以使用的字体资产

如果不行打开window->textMeshpro->font asset creator窗口

这样生成字体文件即可使用

设置:

在text下方,outline轮廓线(颜色,大小)

Prefab预制体

Prefab预制体,将设置的组合体,保存为资源,

original prefab 源预制件:一个新的独立的模板

prefab variant预制变体:基于另一个预制件(基类)创建的,它继承了这个预制件的所有属性和组件,这种方式基类一旦改变,子类都会被改变

单例

但这时资源和场景是完全分离的,因此如果预制体调用了场景中其他实例(类对象),则无法获取到,抛出nullreferenceException空引用异常

因此想要防止上述情况,其中一种解决方式,设置被调用实例为单例(在程序中唯一类实例instance,可以被所有脚本访问),这样其中的方法就不属于任何类实例,就可以直接获取了

将prefab source拖放到场景,相当于创建了派生类对象,因此更改prefab会影响所有派生类override,更改某个派生类不会影响基类

当我们更改了任意override覆盖体,点击它inspector->override,有两个选择revert all(恢复到prefab),apply all(应用更改到所有override)

当不能将obj拖放到场景,很有可能我们处于game窗口而非scene窗口

报错❌:不知道具体原因,发生static的单例类实例获取不到,比如每次重启必须重新添加这个单例类,或者干脆获取不到,这时我们使用public 单例calss的方式,添加单例类的引用,才可以

TileMap

创建obj,tile anchor设置每个瓦片大小

打开window->2D->tile palette 面板,用于设置瓦片颜色,

create palette创建一个调色板,将集合所有图片的PNG拖进去,创建

代码规范

类名(创建时不能有空白,且需要和脚本类名一致)/函数名大驼峰,变量小驼峰

不要在脚本内设置=;在引擎中显示拖拽

vscode快捷键

ctrl + shilt + k删除行

ctrl + d 选中光标所在的单词

ctrl + shift + \左右括号之间跳转

ctrl + k + s快捷键编辑

ctrl + '+‘ + ’. ‘ 自动生成定义等

enter,tab补全方式不同

ctrl + b 显示,关闭Explore

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值