• unity 小功能、知识点二


    协同程序的开启与终止:
           在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
           在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。
            在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。
            还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;如是将协同程序所在脚本的enabled设置为false则不会生效。这是因为协同程序被开启后作为一个线程在运行,而MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线程。然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重名。

    计算一段字体的宽度(如 我是程序员 是程  需要插入一个箭头,箭头长度可知,需要计算是程 间的空格数)

    private float GetTextWhide(int fontsize, Font font, string str)
    {
    font.RequestCharactersInTexture(str, fontsize, FontStyle.Normal);
    CharacterInfo characterInfo;
    float width = 0f;
    for (int i = 0; i < str.Length; i++)
    {
    font.GetCharacterInfo(str[i], out characterInfo, fontsize);
    width += characterInfo.advance;
    }
    return width;
    }

    其中fontsize为这个Text的字体大小,font为这个使用的字体,str是你要计算长度的字符串,该函数会返回一个表示这个字符串在指定Text上渲染时的宽度。

    UGUI空格导致换行:将空格转换为全角空格,半角空格会使Text自动换行。


    实现text显示不同颜色的字,如我是程序员小白,其中程序员为红色,其余自为黑色。使用透明颜色标签<color=#0000ff00>111</color>,其中的111不会显示在Text上但会占据格子,作用类似于空格,通过这个标签的颜色值可以改变相应的字体颜色。

    颜色标签链接:http://blog.csdn.net/ynn0705/article/details/7012516

    unity 编辑状态下暂停:

    1.Debug.Break();或者UnityEditor.EditorApplication.isPaused = false;

    2.使用编辑器类:EditorApplication.ExecuteMenuItem("Edit/Play");
    3.UnityEditor.EditorApplication.isPlaying = false;

    问题:
    unity中通过Application.dataPath + "/Resources/Config/xxx")作为将要读取文件的路径时,在编辑器上正常运行,但在打包后却无法正确读取文件
    解决:
    这是因为不同平台Application.dataPath所指定的路径不一样,editor模式下代表的是Asset,打包后对应的路径是打包时生成的文件夹“xxx_data”,这是需要把对应的文件拷贝到“xxx_data”文件夹下,例如打包后文件路径“E:UnityTowerDefenseBuild塔防_DataResourcesConfig”对应编辑器下的“E:UnityTowerDefenseAssetsResourcesConfig”。

    问题:
    UNITY 无法导入视频解决方法
    解决
    1.unity 导入视频时无法转换成movieTexture, 这时候unity会提示影片导入失败,这时候需要安转QuickTime Player,这个软件可以把unity的影片转换成unity能用的材质。
    2.QuickTime 无法正常运行时并且提示 “please install apple application support”时,打开下载的QuickTime安装包,选择安装“apple application support.msi”,安装选择“修复”。
    3.unity支持的影片格式有.mov .mpg .mpeg .mp4 .avi .asf。
    4.成功导入的影片会生成一个对应的Movie Audio,这个文件是该影片的声音文件。

    问题:Scroll Rect中滑动事件是通过EventTrigger响应,所以当item也是通过EventTrigger响应点击事件时,就会遮挡住后面的Scroll Rect的滑动事件。
    UGUI的ScrollRect组件会和放在它上面的button或者toggle等组件有事件响应的冲突,具体体现为上面的组件会遮挡下面的响应,在button或者toggle等组件上出现只能点击不能滑动的效果,要想滑动必须点旁边才行。
    解决:
    (1).Button: Button.onClick.AddListener(delegate () {ButtonOnClick(Button.gameObject); }); onClick回调函数 是继承自UnityEngine.Events.UnityAction.委托。由于同一个点击事件通过不同的事件模块去响应,很好的处理了item挡住Scroll Rect 事件的问题。委托格式为不带任何参数和返回的函数。
    这里的Button是指你要按下的那个按钮,ButtonOnClick是该按钮按下时要触发的事件。
    第二种解决方案是:不用按钮,1.新建一个继承MonoBehaviour和IPointerClickHandler接口的脚本(例如ClickObject),2.这个脚本实现public void OnPointerClick(PointerEventData eventData)方法:3.创建一个名为Panel_IPointer的空对象,这个空对象就是你的按钮。并且将ClickObject脚本附加到对象上。这时候点击这个对象就会调用OnPointerClick方法。
    第三种:创建一个Image(例如名为Btn),Btn对象添加EventTrigger组件," Add New" -> 选择" PointerClick"。将Btn对象拖拽到触发者位置。然后点击"No Function"选择我们要触发的OnTestClick事件。
    (2)toggle:使用isOn的方法,例如if(toggle.ison){debug.log("click")};

    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    idea maven 经常主目录自动变回默认怎么办
    .net5 quartz
    sed命令
    ubuntu静态ip
    powershell基础
    restsharp 107.3 json自动转小写 自动驼峰 问题
    CQRS与事件溯源模式
    abp 切换默认项目为pgsql
    .net ASPNETCORE_ENVIRONMENT 根据环境切换不同的配置文件
    交换机端口三种模式Access,Hybrid,Trunk收发数据处理过程 yi
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8277699.html
Copyright © 2020-2023  润新知