Unity C# 函数笔记

2023-11-17

寻找子对象的某个组件

	public T FindTransform<T>(string name, Transform trans) where T : Component
	{
    	foreach (T c in trans.GetComponentsInChildren<T>())
    	{
        	if (c.name == name)
        	{
            	return c;
        	}
    	}

    	return null;
	}

获取RenderFeature

	private static readonly Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>> s_renderFeatures = new Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>>();

	public static ScriptableRendererFeature GetRendererFeature(this ScriptableRenderer renderer, string name)
	{
    	if (!s_renderFeatures.TryGetValue(renderer, out var innerFeatures))
    	{
        	var propertyInfo = renderer.GetType().GetProperty("rendererFeatures", BindingFlags.Instance | BindingFlags.NonPublic);
        
        	List<ScriptableRendererFeature> rendererFeatures = (List<ScriptableRendererFeature>)propertyInfo?.GetValue(renderer);
        
        	if (rendererFeatures == null)
        	{
            	s_renderFeatures[renderer] = null;
        	}
        	else
        	{
            	innerFeatures = new Dictionary<string, ScriptableRendererFeature>();
            	for (var i = 0; i < rendererFeatures.Count; i++)
            	{
                	var feature = rendererFeatures[i];
                	innerFeatures[feature.name] = feature;
            	}
            	s_renderFeatures[renderer] = innerFeatures;
        	}
    	}
        
    	if (innerFeatures != null)
    	{
        	innerFeatures.TryGetValue(name, out var result);
        	return result;
    	}
        
    	return null;
	}

获取继承某个父类的所有子类类型

	TypeCache.TypeCollection types = TypeCache.GetTypesDerivedFrom<ScriptableRendererFeature>();
	foreach (Type type in types)
	{
    	Debug.Log(type);
	}

OnValidate详解

	/// Timeline 不会触发 OnValidate()

查找对象的根对象

	private Transform GetRoot()
	{
    	var p = this.transform;
    	while (p.parent is {})
    	{
        	p = p.parent;
    	}

    	return p;
	}

	private Transform GetRootByComponent<T>() where T : Component
	{
    	var comp = transform.parent.GetComponentInParent<T>();
    	return comp.transform;
	}

获取材质的所有属性

	private void GetPropertiesInMaterial(Material mat)
	{
    	var len = mat.shader.GetPropertyCount();
    	for (int i = 0; i < len; i++)
    	{
        	var propertyName = mat.shader.GetPropertyName(i);
        	var id              = mat.shader.GetPropertyNameId(i);
        	var desc         = mat.shader.GetPropertyDescription(i);
        	var type               = mat.shader.GetPropertyType(i);
        
        
    	}
	}

Editor事件


private bool LeftClickDown()
{
    if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
        return true;

    return false;
}
    
private bool LeftClickUp()
{
    if (Event.current.type == EventType.MouseUp && Event.current.button == 0)
        return true;

    return false;
}

	private bool LeftDrag()
	{
    	if (Event.current.type == EventType.MouseDrag && Event.current.button == 0)
        	return true;

    	return false;
	}
    
	private bool RightClickDown()
	{
    	if (Event.current.type == EventType.ContextClick)
        	return true;

    	return false;
	}

	private bool BackSpace()
	{
    	if (Event.current.keyCode == KeyCode.Backspace && Event.current.type == EventType.KeyDown)
        	return true;

    	return false;
	}

	private bool ClickInRect(Rect targetRect)
	{
    	return targetRect.Contains(Event.current.mousePosition);
	}

	private Vector2 MousePosition()
	{
    	return Event.current.mousePosition;
	}

	private float MousePositionX()
	{
    	return MousePosition().x;
	}
    
	private float MousePositionY()
	{
    	return MousePosition().y;
	}

追帧操作

	private void UpdateCurrentIntervalDuration()
	{
    	currentIntervalDuration += Time.deltaTime;
    	while (currentIntervalDuration >= m_FrameIntervalTime)
    	{
        	var interval = currentIntervalDuration - m_FrameIntervalTime;

        	m_CurrentIndex++;
        
        	currentIntervalDuration = interval;
    	}
	}

获取资产路径

	AssetDatabase.GetAllAssetPaths()

单例

	public abstract class GameObjectSingleton<T> where T : new()
    {
        public static T Singleton
        {
            get
            {
                if (_singleton == null)
                {
                    if (_singleton == null)
                    {
                        _singleton = new T();
                    }
                }

                return _singleton;
            }

            set { _singleton = value; }
        } 
        private static T _singleton;
    }

    public abstract class GameObjectSynchronousSingleton<T> where T : new()
    {
        private static T _singleton;
        private static object mutex = new object();

        public static T Singleton
        {
            get
            {
                if (_singleton == null)
                {
                    lock (mutex)
                    {
                        if (_singleton == null)
                        {
                            _singleton = new T();
                        }
                    }
                }

                return _singleton;
            }
        } 
    }

    public abstract class UnitySingleton<T> : MonoBehaviour where T : Component
    {
        private static T _singleton = null;

        public static T Singleton
        {
            get
            {
                if (_singleton == null)
                {
                    _singleton = FindObjectOfType(typeof(T)) as T;
                    if (_singleton == null)
                    {
                        UnityEngine.GameObject obj = new UnityEngine.GameObject();
                        _singleton = (T)obj.AddComponent(typeof(T));
                        obj.hideFlags = HideFlags.DontSave;
                        obj.name = typeof(T).Name;
                    }
                }

                return _singleton;
            }
        }

        public virtual void Awake()
        {
            DontDestroyOnLoad(this.gameObject);
            if (_singleton == null)
            {
                _singleton = this as T;
            }
            else
            {
                Destroy(this.gameObject);
            }
        }
    }

计时器

	public class Timer
    {
        public enum STATE
        {
            Idle,
            Run,
            Finished
        }

        public STATE state = STATE.Idle;
        private float _duration = 1.0f;
        private float _elapsedTime = 0;

        public Timer(float duration = 1)
        {
            this._duration = duration;
        }

        public void UpdateTimer(float deltaTime)
        {
            if (state == STATE.Run)
            {
                _elapsedTime += deltaTime;
                if (_elapsedTime >= _duration)
                    state = STATE.Finished;
            }
        }

        public void Go()
        {
            _elapsedTime = 0;
            state = STATE.Run;
        }

        public void Reset()
        {
            _elapsedTime = 0;
            state = STATE.Idle;
        }

        public void SetDuration(float duration)
        {
            this._duration = duration;
        }

行为按钮

	public class ActionButton
    {
        public bool IsPressing = false;
        public bool OnPressed = false;
        public bool OnRelease = false;
        public bool IsExtending = false;
        public bool IsDelaying = false;

        private bool _lastState = false;
        private bool _currentState = false;

        private readonly Timer _extendTimer = new Timer();
        private readonly Timer _delayTimer  = new Timer();
        private readonly float _extendingDuration = 0.5f;
        private readonly float _delayingDuration  = 0.15f;
    
        public ActionButton(float extendingDuration = 0.5f, float delayingDuration = 0.15f){
            this._extendingDuration = extendingDuration;
            this._delayingDuration = delayingDuration;
        }
    
        public void UpdateButton(bool input, float deltaTime)
        {
            _extendTimer.UpdateTimer(deltaTime);
            _delayTimer.UpdateTimer(deltaTime);

            _currentState = input;
            IsPressing = _currentState;

            OnRelease = false;
            OnPressed = false;
            IsExtending = false;
            IsDelaying = false;

            if(_currentState != _lastState)
            {
                if(_currentState == true)
                {
                    OnPressed = true;
                    StartTimer(_delayTimer, _delayingDuration);
                }
                else
                {
                    OnRelease = true;
                    StartTimer(_extendTimer, _extendingDuration);
                }
            }
            _lastState = _currentState;

            if (_delayTimer.state == Timer.STATE.Run)
            {
                IsDelaying = true;
            }
            
            if (_extendTimer.state == Timer.STATE.Run)
            {
                IsExtending = true;
            }
        }

        void StartTimer(Timer timer, float duration)
        {
            timer.SetDuration(duration);
            timer.Go();
        }
    }

正反形映射到球形

private Vector2 Square2CircleMapping(float x, float y)
{
    var circle = new Vector2();
    circle.x = x * Mathf.Sqrt(1.0f - (y * y) * 0.5f);
    circle.y = y * Mathf.Sqrt(1.0f - (x * x) * 0.5f);

    return circle;
}

判断是否在包围盒内


public bool CheckInBox()
{
    var targetPos = _target.position;
    var matrix = transform.worldToLocalMatrix;
            
    var center = _boxCollider.center;
    var size = _boxCollider.size;
            
    targetPos = matrix.MultiplyPoint(targetPos);
            
    if(targetPos.x >= (center.x - 0.5f * size.x) && targetPos.x <= (center.x + 0.5f * size.x))
        if(targetPos.y >= (center.y - 0.5f * size.y) && targetPos.y <= (center.y + 0.5f * size.y))
            if(targetPos.z >= (center.z - 0.5f * size.z) && targetPos.z <= (center.z + 0.5f * size.z))
                return true;
            
    return false;
}

RenderFeature模板

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class RenderFeature : ScriptableRendererFeature
{
    [System.Serializable]
    public class Settings
    {
        public bool IsEnabled = true;
        public RenderPassEvent WhenToInsert = RenderPassEvent.AfterRendering;
        public Material MaterialToBlit;
    }

    public Settings settings = new Settings();

    private RenderTargetHandle renderTextureHandle;
    private RenderPass myRenderPass;

    public override void Create()
    {
        myRenderPass = new RenderPass(
            "OverWater pass",
            settings.WhenToInsert,
            settings.MaterialToBlit
        );
    }
    
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        if (!settings.IsEnabled)
        {
            return;
        }

        var cameraColorTargetIdent = renderer.cameraColorTarget;
        myRenderPass.Setup(cameraColorTargetIdent);

        renderer.EnqueuePass(myRenderPass);
    }

    public class RenderPass : ScriptableRenderPass
    {
        private string m_ProfilerTag;

        private Material m_MaterialToBlit;
        private RenderTargetIdentifier m_CameraColorTargetIdent;
        private RenderTargetHandle m_Temp;

        public RenderPass(
            string profilerTag,
            RenderPassEvent renderPassEvent, 
            Material material
        )
        {
            this.m_ProfilerTag = profilerTag;
            this.renderPassEvent = renderPassEvent;
            this.m_MaterialToBlit = material;
        }

        public void Setup(RenderTargetIdentifier cameraColorTargetIdent)
        {
            this.m_CameraColorTargetIdent = cameraColorTargetIdent;
        }

        public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
        {
            cmd.GetTemporaryRT(m_Temp.id, cameraTextureDescriptor);
        }

        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
            cmd.Clear();

            cmd.Blit(m_CameraColorTargetIdent, m_Temp.Identifier(), m_MaterialToBlit, 0);
            cmd.Blit(m_Temp.Identifier(), m_CameraColorTargetIdent);

            context.ExecuteCommandBuffer(cmd);

            cmd.Clear();
            CommandBufferPool.Release(cmd);
        }

        public override void FrameCleanup(CommandBuffer cmd)
        {
            cmd.ReleaseTemporaryRT(m_Temp.id);
        }
    }
}

VP矩阵构建

public Matrix4x4 GetViewMatrix()
    {
        var waterPosition = transform.position;
        var cameraPosition = waterPosition + new Vector3(0, CameraHeight, 0);
        var cameraForward = Vector3.down;
        
        var v = Matrix4x4.TRS(cameraPosition, Quaternion.LookRotation(cameraForward, Vector3.up), Vector3.one).inverse; 
        return v;
    }

    public Matrix4x4 GetProjectionMatrix()
    {
        var aabb = GetAABB();
        var p = Matrix4x4.Ortho(aabb.left, aabb.right, aabb.bottom, aabb.top, 0.0f, 300);
        return p;
    }

    private AABB GetAABB()
    {
        var bound = GetComponent<MeshFilter>().sharedMesh.bounds;
        var aabb = new AABB()
        {
            top = bound.max.z,
            bottom = bound.min.z,
            left = bound.min.x,
            right = bound.max.x
        };

        return aabb;
    }

打包变体过滤

public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data)
    {
        for (int i = data.Count - 1; i >= 0; --i)
        {
            if (data[i].shaderKeywordSet.IsEnabled(new ShaderKeyword("")))
                data.Remove(data[i]);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity C# 函数笔记 的相关文章

  • Python 的 pack("

    我不太了解 python 但从文档中可以看出代码 str AAAA str pack
  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 一篇了解Containerd容器运行时及安装

    文章目录 一 Containerd简介 1 什么是Containerd 2 Containerd和Docker的区别是什么 二 使用yum仓库安装Containerd 三 使用源码安装Containerd 四 配置国内镜像加速地址 一 Co
  • 寻找第K大的数的方法总结

    寻找第K大的数的方法总结 今天看算法分析是 看到一个这样的问题 就是在一堆数据中查找到第k个大的值 名称是 设计一组N个数 确定其中第k个最大值 这是一个选择问题 当然 解决这个问题的方法很多 本人在网上搜索了一番 查找到以下的方式 决定很
  • vscode 跳转到指定的行数的快捷键

    在工作中 尤其是容易产生错误的 js 代码 报错之后会提示有错误代码的位置 也就是在哪一行出问题了 在vscode 编辑器中 可以使用快捷键 跳转到指定的行数 快捷键 Ctrl G 然后在弹出的框中输入行数就可以了
  • 业务风控思考:如何建立识别、防御和决策体系?

    导语 在疫情扰乱生活节奏的三年中 经常会看到企业 降本增效 的话题 如 让员工感受寒气 搬走办公室绿植 降低食堂伙食标准等等 就企业运作成本而言 降低黑灰产 羊毛党 打码平台等 盗夺的有限资源无疑是最有效的降本方式之一 据不完全统计 我国现
  • CSS高级篇——多背景&背景原点

    CSS 提供了很多处理背景的手段 多背景 background image 可以同时设置多个背景图片 background image url this jpg url that gif url theother png 效果如下 back
  • 深度学习-Tensorflow2.2-卷积神经网络{3}-卫星图像识别卷积综合实例(二分类)-13

    import tensorflow as tf import matplotlib pyplot as plt matplotlib inline import numpy as np import pathlib 数据读取及预处理 dat
  • imap服务器收缓存pst文件夹,Outlook 转移OST数据文件 IMAP账户

    问题 windows8系统 装了Outlook2013 占用了C盘大约10G空间 主要都是数据文件 OST文件 占用的 希望能够把数据文件从C盘移至其他盘 并且账户是IMAP账户 不是Exchange google一下 绝大多数解决方案是针
  • 儿童趣味编程是什么?如何启迪编程思维?

    从前在大多数人的认知里 编程是成年人才能接触和应用到的知识和技术 它好像很晦涩难懂 离小孩子们的世界非常远 但是身处互联网时代 编程已经面向所有人群 孩子们也不必等到大学才能接触到相关知识 而是在小学或者更早的学龄前阶段 就有了系统学习编程
  • 日志的管理

    日志介绍 1 日志文件是重要的系统信息文件 记录了许多的重要的系统事件 包括有用户的登录信息 系统的启动信息 系统的安全信息 邮件相关信息 各种服务相关信息等 2 日志对于安全来说非常的重要 它记录了系统每天发生的各种事情 通过日志来检查错
  • mysql_real_connect 连接失败 问题!

    mysql 的c函数mysql real connect 用localhost为参数进行连接 第一次会成功 但第二次就会抛出异常 本人遇到这个问题 查找了好久 最后才发现问题所在 解决办法 改用ip地址就可以 经验共享
  • 目标检测之 IoU

    转载自 https blog csdn net u014061630 article details 82818112 IoU 作为目标检测算法性能 mAP 计算的一个非常重要的函数 但纵观 IoU 计算的介绍知识 都是直接给出代码 给出计
  • 基于树莓派博通BCM2835芯片手册导读写编简单引脚驱动代码编译和测试(树莓派)

    编写引脚驱动代码 这边写的是17引脚的驱动代码代码 IO口控制的代码在下面 这边只是简单的代码 驱动代码 include
  • 获取微信步数

    获取微信步数 getWalkCounts function var that this wx login success res wx getWeRunData success res1 console log res1 if res1 e
  • Java项目:ERP管理系统(java+SpringBoot+EasyUI+maven+mysql)

    源码获取 博客首页 资源 里下载 项目介绍 系统主要功能包括 首页 零售管理 零售出库 零售退货 采购管理 采购订单 采购入库 采购退货 销售管理 销售订单 销售出库 销售退货 仓库管理 其它入库 其它出库 调拨出库 组装单 拆卸单 财务管
  • Maven 中启动 Tomcat,控制台打印信息出现乱码

    Tomcat 可以正常启动 但是控制台输出打印的是乱码 很多教程要修改 settings 中的 VM Options 或者 File Encodings 但我的配置都是正确的 最后发现是因为新版本 Tomcat 改用 utf8 编码输出日志
  • 嵌入式开发--SPI介绍和驱动开发

    目录 一 通信总线SPI介绍 二 SPI时序介绍和工作模式 三 基于stm32的spi初始化步骤 一 通信总线SPI介绍 SPI 全称为Serial Peripheral Interface 是一种同步的串行通信协议 SPI协议最初由Mot
  • 不使用第3个变量,实现两个数的对调

    任务描述 本关任务 下列程序是不用第三个变量 实现将两个数进行对调的操作 程序代码如下 1 include
  • Python中pip安装与使用及错误解决方案合集

    文章目录 前言 一 pip 安装与使用 二 pip安装错误解决方案合集 1 module包没安装 2 import缺失 3 init py文件缺失 4 安装的第三方module包的版本不对 5 import导错包 6 未设置PYTHONPA
  • ionic ajax数据,Ionic/Cordova - AJAX requests failing with status

    I am unable to get my AJAX requests working on an Ionic Cordova app deployed to iOS and Android I get the following reje
  • Unity C# 函数笔记

    寻找子对象的某个组件 public T FindTransform