unity笔记

快捷键

Alt 加左键 是以当前的中心旋转
右键 + wasd 是以游戏模式视角浏览
F键能使物体居中

rider代码无提示问题

Rider打开Unity脚本后没有代码提示的解决办法

获取ui按钮节点 点击

public class button: MonoBehaviour
    {
        private UIDocument _uiDocument;

        private void Awake()
        {
            _uiDocument = GetComponent<UIDocument>();
        }

        private void Start()
        {
            VisualElement root = _uiDocument.rootVisualElement;
            Button button = root.Q<Button>();
            button.clicked += () =>  Debug.Log("hello world");
        }
    }

加载场景

SceneManager.LoadScene()

相机漫游

DOTWEEN插件
http://dotween.demigiant.com/getstarted.php
https://blog.csdn.net/daijinghui512/article/details/123633463?ops_request_misc=&request_id=&biz_id=102&utm_term=unity3d%20dotween&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-123633463.142v59js_top,201v3add_ask&spm=1018.2226.3001.4187

UI

https://learn.u3d.cn/tutorial/ui-toolkit-start-menu?chapterId=63562b26edca72001f21d015#62f0d51a16d459002179f4b1

事件

在Unity中,事件委托是一种常见的设计模式,用于实现对象间的松耦合通信。以下是在Unity中使用事件委托的基本步骤:

  1. 定义委托类型:首先,您需要定义一个委托类型,该委托描述了事件的签名(参数和返回类型)。
public delegate void MyEventHandler();
  1. 声明事件:在包含事件的类中声明事件,并使用定义的委托类型。
public event MyEventHandler OnEvent;
  1. 触发事件:在适当的时机,通过调用事件来触发它。
if (OnEvent != null)
{
    OnEvent();
}
  1. 添加/移除事件侦听器:其他类可以订阅事件并定义事件发生时的行为。它们可以添加或移除事件侦听器。
someObject.OnEvent += HandleEvent;   // 添加事件侦听器
someObject.OnEvent -= HandleEvent;   // 移除事件侦听器
  1. 编写事件侦听器方法:定义事件侦听器方法,它与委托类型的签名匹配,并在事件发生时执行。
void HandleEvent()
{
    // 处理事件的逻辑
}

下面是一个完整的示例:

using UnityEngine;

public class EventExample : MonoBehaviour
{
    public delegate void MyEventHandler();
    public event MyEventHandler OnEvent;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (OnEvent != null)
            {
                OnEvent();
            }
        }
    }
}

public class Listener : MonoBehaviour
{
    private void Start()
    {
        EventExample eventExample = FindObjectOfType<EventExample>();
        eventExample.OnEvent += HandleEvent;
    }

    private void HandleEvent()
    {
        Debug.Log("Event occurred!");
    }
}

在上面的示例中,EventExample类触发一个事件OnEvent,而Listener类订阅该事件并在事件发生时输出一条日志。

请注意,Unity还提供了更高级的事件系统,例如使用UnityEvent或C#的Action委托。这些更高级的系统提供更多功能和灵活性,可以用于处理不同类型的事件和参数。

动画只执行一次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

yunxin02Animator.SetBool("back", true);

要设置出路,否则触发不了OnStateExit事件, 在完成的时候设置变量为false. 这样动画只会执行一次。
在这里插入图片描述

unity更新材质透明度

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeMaterial : MonoBehaviour
{

    public Material newMaterial;
    // Start is called before the first frame update
    void Start()
    {
        MeshRenderer[] meshRenderers = transform.GetComponentsInChildren<MeshRenderer>();
        foreach (MeshRenderer meshRenderer in meshRenderers) {
            Material[] materials = meshRenderer.materials;

            for (int i = 0; i < materials.Length; i++)
            {
                materials[i] = newMaterial;
            }

            meshRenderer.materials = materials;
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

unity非主线程不能操作ui!!!!

在Unity中,UI更新必须在主线程上执行。如果尝试在非主线程上直接操作UI,可能会引发以下问题:

  1. 线程冲突:Unity的UI系统不是线程安全的,这意味着在多线程环境中直接操作UI可能导致竞争条件和不一致的状态。这可能导致UI元素的异常行为、崩溃或数据损坏。

  2. Unity引擎限制:Unity的UI系统是在主线程上更新和渲染的。如果在非主线程上尝试更新UI,可能会与Unity引擎的内部逻辑冲突,导致意外的行为或崩溃。

  3. 可视化错误:由于UI更新是在主线程上执行的,如果在非主线程上直接更新UI,更新可能不会立即反映在屏幕上,或者可能导致不正确的渲染顺序和视觉错误。

为了避免这些问题,你应该始终确保在主线程上操作UI。可以使用Unity提供的工具类(例如UnityMainThreadDispatcherUnitySynchronizationContextMainThreadTaskExecutor)或相关的API来在非主线程中调度UI更新操作到主线程。这样可以确保UI的正确性、稳定性和可视化的一致性。

总结起来,非主线程操作UI可能会导致线程冲突、Unity引擎限制和可视化错误。因此,为了避免这些问题,务必在主线程上进行UI操作。

解决办法
https://github.com/PimDeWitte/UnityMainThreadDispatcher

unity协程更新ui会导致卡

这次vr调试就是因为在协程更新ui导致很卡,解决办法是不用协程,用async task,await

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值