快捷键
Alt 加左键 是以当前的中心旋转
右键 + wasd 是以游戏模式视角浏览
F键能使物体居中
rider代码无提示问题
获取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
事件
在Unity中,事件委托是一种常见的设计模式,用于实现对象间的松耦合通信。以下是在Unity中使用事件委托的基本步骤:
- 定义委托类型:首先,您需要定义一个委托类型,该委托描述了事件的签名(参数和返回类型)。
public delegate void MyEventHandler();
- 声明事件:在包含事件的类中声明事件,并使用定义的委托类型。
public event MyEventHandler OnEvent;
- 触发事件:在适当的时机,通过调用事件来触发它。
if (OnEvent != null)
{
OnEvent();
}
- 添加/移除事件侦听器:其他类可以订阅事件并定义事件发生时的行为。它们可以添加或移除事件侦听器。
someObject.OnEvent += HandleEvent; // 添加事件侦听器
someObject.OnEvent -= HandleEvent; // 移除事件侦听器
- 编写事件侦听器方法:定义事件侦听器方法,它与委托类型的签名匹配,并在事件发生时执行。
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,可能会引发以下问题:
-
线程冲突:Unity的UI系统不是线程安全的,这意味着在多线程环境中直接操作UI可能导致竞争条件和不一致的状态。这可能导致UI元素的异常行为、崩溃或数据损坏。
-
Unity引擎限制:Unity的UI系统是在主线程上更新和渲染的。如果在非主线程上尝试更新UI,可能会与Unity引擎的内部逻辑冲突,导致意外的行为或崩溃。
-
可视化错误:由于UI更新是在主线程上执行的,如果在非主线程上直接更新UI,更新可能不会立即反映在屏幕上,或者可能导致不正确的渲染顺序和视觉错误。
为了避免这些问题,你应该始终确保在主线程上操作UI。可以使用Unity提供的工具类(例如UnityMainThreadDispatcher
、UnitySynchronizationContext
或MainThreadTaskExecutor
)或相关的API来在非主线程中调度UI更新操作到主线程。这样可以确保UI的正确性、稳定性和可视化的一致性。
总结起来,非主线程操作UI可能会导致线程冲突、Unity引擎限制和可视化错误。因此,为了避免这些问题,务必在主线程上进行UI操作。
解决办法
https://github.com/PimDeWitte/UnityMainThreadDispatcher
unity协程更新ui会导致卡
这次vr调试就是因为在协程更新ui导致很卡,解决办法是不用协程,用async task,await