【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 中方便切换
image

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 条件节点 只能作为叶子节点,判断条件

8.2、有限状态机

posted @   卡卡鸡  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示