【Unity】随心记
目录
一、代码操作组件
- 1.1、组件的生命周期
- 1.2、添加物体
- 1.3、删除物体
- 1.4、获取物体
二、角色控制
- 2.1、基础移动与转向
- 2.2、角色管理类
三、相机控制
- 3.1、相机跟随
- 3.2、虚拟相机
四、动画系统
五、碰撞系统
- 5.1、碰撞器与触发器的区别
六、场景系统
- 6.1、场景切换
七、输入设备
八、敌人AI
- 8.1、行为树
- 8.2、有限状态机
一、代码操作组件
1.1、组件的生命周期
//使用 Awake 来代替构造函数进行初始化,因为组件的序列化状态在构造时是未定义的。
//与构造函数一样,仅调用 Awake 一次。
//调用时间:最早调用,所以一般可以在此实现单例模式
void Awake(){}
//调用时间:组件激活后调用,在Awake后调用一次
void OnEnable(){}
//初始化函数,在所有Awake函数运行完之后(一般是这样,但不一定)在所有Update函数前系统自动调用。
//一般用来给变量赋值。
//调用时间:在UpDate之前调用一次,在OnEnable之后调用,可以在此设置一些初始值
void Start(){}
//固定帧率调用方法,每次调用与上次调用的时间间隔相同
void FixedUpdate(){}
//调用时间:帧率调用方法,每一帧调用一次,每次调用与上次调用的时间间隔不相同
void Update(){}
//调用时间:在Update每调用完一次后,紧跟着调用一次
void LateUpdate(){}
//调用时间:在OnEnable相反,组件未激活时调用
void OnDisable(){}
//调用时间:被销毁后调用一次
void OnDestroy(){}
1.2、添加物体
1.3、删除物体
//直接删除物体
Destroy(Object);
//定时删除物体 Destroy(待删除物体, 执行等待时间);
Destroy(Object, 2);
//删除物体上挂载的脚本 即当前脚本
Destroy(this);
//删除某一个组件(不局限于脚本 因脚本也是一种组件)
Destroy(transform.GetComponent<createprim>());
//立马删除物体
DestroyImmediate(Object);
//跳转场景时不删除某物体
DontDestroyOnLoad(Object);
1.3、获取物体
【GetComponent<T>】:获取当前组件里的对象或属性
【GetComponentInParent<T>】:获取父组件里的对象或属性
【GetComponentInChildren<T>】:获取子组件里的对象或属性
二、角色控制
2.1、基础移动与转向
[Header("移动相关")]
public float Run_Speed;
public float Walk_Speed;
private Rigidbody2D rb;
private BoxCollider2D coll;
float xVelocity;
void Start()
{
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<BoxCollider2D>();
}
private void FixedUpdate()
{
GroundMovement();
}
void GroundMovement()
{
xVelocity = Input.GetAxis("Horizontal");//返回浮点型:-1 1
rb.velocity = new Vector2(xVelocity * Speed, rb.velocity.y);//移动
FilpDirction();//转向
}
private void FilpDirction()
{
if (xVelocity < 0)
{
transform.localScale = new Vector2(-1, 1);
}
else
{
transform.localScale = new Vector2(1, 1);
}
}
2.2、角色管理类
三、相机控制
3.1、相机跟随
实现方法有两种:
① 直接将相机当成角色对象的子类,缺点就是角色转向后会跟着翻转,以及要做打击感模拟时也会非常难受。
② 使用代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;// 相对对象位置
public float smoothing;// 相机到相对对象位置所需要的时间
//帧后渲染
private void LateUpdate()
{
if (target != null)
{
if (transform.position != target.position)
{
Vector2 targetPos = target.position;
transform.position = Vector2.Lerp(transform.position, targetPos, smoothing);
}
}
}
}
3.2、Cinemachine 虚拟相机
【安装Cinemachine】
Window -> Package Manager -> Cinemachine
【创建Vitual Camera】
此时Main Camera被CM vcam控制,无法调整Main Camera
【相机聚焦】
将被聚焦的物体拖拽进CinemachineVirtualCamera下的Look At
【相机跟随】
将被聚焦的物体拖拽进CinemachineVirtualCamera下的Follow
【相机切换】
创建多个CM vcam,通过开启与关闭进行切换
多种切换方式 :CinemachineBrain -> Default Blend
自定义切换方式 :CinemachineBrain -> Custom Blends
【安裝并开启Timeline】
Window -> Sequencing -> Timeline
【相机自动切换】
A.CM vcam拖拽进Timeline窗口 -> Add Activation Track(是否启动) 拖动时间轴,调整顺序
B.Cinemachine Track -> 赋值Cinemachine BrainBlend Curves可調節切換漸變方式
四、动画系统
五、碰撞系统
5.1、碰撞器与触发器的区别
碰撞器: 是一群组件,用来检测碰撞的
触发器:只是碰撞器上的一个属性,用来检测是否与其他碰撞器发生重合
//发生碰撞
private void OnCollisionEnter(){}
//持续碰撞
private void OnCollisionStay(){}
//结束碰撞
private void OnConllisionExit(Collision collision){}
//进入触发器
private void OnTriggerEnter(Collider collider){}
//退出触发器
private void OnTriggerExit(Collider collider){}
//逗留触发器
private void OnTriggerStay(Collider collider){}
六、场景系统
6.1、创建场景
使用快捷键Ctrl + N 创建创建,记得Ctrl + Shift + B 保存到 Build Setting 中方便切换
6.、切换场景
【同步切换场景】:线程是阻塞的 游戏看上去会卡顿
public class DoorToNextLevel : MonoBehaviour
{
[Header("切换场景下标")]
public int Scene_Index;
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.name == "Player")
{
//同步加载场景
//参数可添加场景名称或索引
//SceneManager.LoadScene("Scenes/Scence02");
SceneManager.LoadScene(Scene_Index);
}
}
}
【异步切换场景】 不阻塞线程,加载过程中继续执行代码。异步加载有返回值,返回一个AsyncOperation
public class DoorToNextLevel : MonoBehaviour
{
AsyncOperation operation;
[Header("切换场景下标")]
public int Scene_Index;
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.name == "Player")
{
loadScene();
}
}
IEnumerator loadScene()
{
operation = SceneManager.LoadSceneAsync(Scene_Index);
operation.allowSceneActivation = false;//加载完成之后是否允许跳转
yield return operation;
}
}
七、输入设备
Input.GetKeyDown(KeyCode.W):按下W键
Input.GetKeyUp(KeyCode.W):抬起W建
【长按事件】
//记录某按键按下的帧数
int keyFrame = 0;
void Update ()
{
if (Input.GetKeyDown (KeyCode.A))
{
Debug.Log("A按下一次");
}
if (Input.GetKey (KeyCode.A))
{
//记录按下的帧数
keyFrame++;
Debug.Log("A连按:" + keyFrame+"帧");
}
if (Input.GetKeyUp (KeyCode.A))
{
//抬起后清空帧数
keyFrame=0;
Debug.Log("A按键抬起");
}
}
八、敌人AI
8.1、行为树
行为树是一种自顶向下,从左到右(并发进行)逐层执行的一种树形数据结构。易于扩展,可读性强,不单是游戏AI的专属,也能处理情况复杂的的逻辑问题。
主要由四部分组成:
名称 | 类型 | 作用 |
---|---|---|
Composites | 组合节点 | 只能作为根节点,控制子节点的执行(顺序) |
Decorator | 装饰节点 | 只能作为根节点,修饰子节点 |
Actions | 行为节点 | 只能作为叶子节点,执行具体动作 |
Conditinals | 条件节点 | 只能作为叶子节点,判断条件 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库