unity

Unity3D串口处理

匿名 (未验证) 提交于 2019-12-02 23:51:01
 最近公司用U3D开发一个应用,需要用到串口,便研究了两天串口编程,C#用SerialPort类实现串口编程,便开始使用SerialPort类编写代码。后来发现一个问题,Unity不支持DataReceived的方法。遇到这个问题很是棘手啊,后来在网上搜了一下,发现这个问题确实存在,解决的方法是开启两个线程,一个用来接收数据,一个用来处理数据。将两个线程分别放在FixedUpdate里面调用,这样便可以快速的读取和处理数据了。但是程序运行时,开启Open()方法时,会报System.IO.IOException这个异常。检察了一下应该是该串口被占用。之所以被占用,是因为上次没Close,而每次完成或退出时我确实写了SerialPort的Close()方法。后来在网上查了一下相关的资料,发现如果Close的时候正好赶上读取串口数据,这样两个线程便发生了矛盾,Close方法无法完成。但是代码也不会报错或是抛异常(据说这是微软的一个bug,是不是就不清楚了)。所以说问题就出在了这里。那解决该问题的方法是当启用Close的方法时,必须停止接受串口数据的线程。这样该问题就解决了,代码大致如下: List<byte> liststr;//在ListByte中读取数据,用于做数据处理 List<byte> ListByte;//存放读取的串口数据 private Thread tPort;

unity不规则按钮解决方案

匿名 (未验证) 提交于 2019-12-02 23:51:01
一种是alpha检测 一种是设置collider 参考: https://zhuanlan.zhihu.com/p/34204396 下面给出第二种方案代码 ///按钮多边形点击方案,注意Canvas模式应该是Screen Space - Camera 需设置 Render Camera ///选中按钮右键UI->变更为多边形按钮,编辑子物体的Collider2D即可 ///如果无法编辑Collider 则是Unity编辑器bug 切换下Unity编辑器的布局模式,即可恢复正常 using UnityEngine; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; #endif [RequireComponent(typeof(PolygonCollider2D))] public class NonRectangularButtonImage : Image { private PolygonCollider2D areaPolygon; protected NonRectangularButtonImage() { useLegacyMeshGeneration = true; } private PolygonCollider2D Polygon { get { if (areaPolygon != null)

unity序列化

匿名 (未验证) 提交于 2019-12-02 23:49:02
unity的序列化在unity的开发中起着举重足轻的地位,许多核心的功能都是基于序列化和反序列化来实现的。序列化简单来讲就是就是将我们所要保存的数据进行二进制存储,然后当我们需要的时候,在读取二进制文件,反序列化回来。下面是一些常用的序列化的例子: 存储脚本化的数据。在我们的c#代码中,可以将我们所要存储的数据进行序列化,进行存储 prefab与初始化。在unity开发过程中我们会制作很多的预制体(prefab),这些prefab都是序列化,以二进制的形式保存的。当你要对预制体进行初始化的时候,unity根据之前序列化的信息新建出一个物体,然后将物体上的信息反序列化回去,实现类似于clone的效果。 在unity编辑器的拓展功能,AssetBundle等等,都可以看到序列化的身影。 可序列化对象 公有的,或者有[SerializeField]属性,非静态,非常量,非只读 自定义非抽象类,并且有Serializable属性 继承自unity.object的类 数组和List 注意: 字典不能通过添加Serializable属性进行序列化 如果一个类基类不能被序列化,那它即便添加了序列化特性也无法被序列化 序列化不能保存另一个要反序列化的对象指针,因为反序列化是new一个新的对象,指针指向的内存将不会是原对象 可采用unity编辑器的序列化类ScriptableObject

Unity 鼠标控制视角功能和动画播放冲突解决办法

匿名 (未验证) 提交于 2019-12-02 23:49:02
环境是 unity 5.6.4 情况说明:   1 模型动画单独播放是没问题的。   2 鼠标控制模型是没问题的。   3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作。 解决办法   给模型动画添加父级Gameobject,用鼠标控制模型的父级旋转,而不是直接控制模型旋转,这样播放动画和鼠标功能都可以使用。 转载请标明出处: Unity 鼠标控制视角功能和动画播放冲突解决办法 文章来源: Unity 鼠标控制视角功能和动画播放冲突解决办法

Unity 屏幕坐标到UGUI RectTransform本地坐标的转换

匿名 (未验证) 提交于 2019-12-02 23:47:01
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint); rect: 对应的 RectTransform 的引用 screenPoint: 位置,基于屏幕坐标系 cam: 相机的引用,如果Canvas的Render Mode 为 Screen Space - Camera 模式,则需要填入 Render Camera 对应的引用 localPoint: rect 本地坐标系下的坐标(原点(0,0)位置受Anchor的影响) 参考: https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html using UnityEngine; using UnityEngine.UI; using System.Collections; using UnityEngine.EventSystems; public class GlobalTest : MonoBehaviour { public Canvas canvas; Text uiText;

Unity-动态显示窗口制作思路

匿名 (未验证) 提交于 2019-12-02 23:45:01
此教程来自siki学院的<<暗黑战神>>课程 这次需要记录的是动态显示窗口的制作方式,它的效果是弹出一条游戏Tips,上面可以显示你想显示的内容,随后消失。 显然,我们只需要制作一个动画,动画中改变Text组件的位置即可实现此效果。 然而现在的问题是,不能让这个动画立刻播放,我们需要在特定的时候去播放它,并在特定的时刻停止。 那么怎么实现呢? 我们可以在控制动态显示窗口的脚本中,设置一个方法,当要显示动态Tips时,设置改变Text内容,并激活对应的游戏物体,手动控制动画播放。 注意, 游戏物体不激活时即使动画是自动播放的,也不会播放,只有激活了,才会从头开始播放 。 动画播放后需要停止,因此需要把游戏物体取消激活,但我们在代码中怎么准确地控制它能延时取消激活呢? 这个问题和之前说的异步加载资源服务有点类似,传送门如下: https://www.cnblogs.com/czw52460183/p/11044456.html 当时的思路是在Update中用委托实时查看加载进度,但这里就不行,因为我们没有什么方法可以实时获取到动画播放进度,怎么办呢? 答案是可以使用协程,我们只需要在开启协程后,让它在固定等待一段时间后调用回调方法即可,在这个回调方法中去关闭物体的激活状态即可,而这个等待的时间,就设置成动画的持续时长即可,这样,即使我们没有办法掌握动画的实际播放进度,也可以实现延时关闭

Unity 十三 碰撞条件

匿名 (未验证) 提交于 2019-12-02 23:43:01
在 unity 里面要想实现碰撞,需要满足两个条件。 两个物体都具有碰撞组件。 运动的组件拥有刚体。 对于第一条:碰撞组件有很多, 针对不同的形状有不同的Collider 。其中 Box Collider 是六个面针对的是立方体等,如果不算2d 的 Collider,Box Collider 的面数是最少的,下面还有Capsule Collider 胶囊体,Sphere Collider 球体的。其中针对不规则的物体可以使用 Mesh Collider,比如说坦克,石头等。 如何在程序里检测到碰撞,Unity 已经给了相应的方法。 当两个碰撞的物体,其中一个勾选上 Is Trigger 时,会触发:OnTriggerEnter、OnTriggerStay、OnTriggerExit 当不勾选Is Trigger 时,会触发:OnCollisionEnter、OnCollisionStay、OnCollisionExit。 看上面的英语,字面意思就是, Enter碰撞开始,Stay 碰撞保持,Exit 碰撞结束。 每个方法都有一个参数Collider other,这个代表与它发生碰撞的另外一个物体。 private void OnTriggerEnter(Collider other) { Debug.Log("OnTriggerEnter:::"+other.transform

保存Unity中的Log日志

匿名 (未验证) 提交于 2019-12-02 23:43:01
代码中的debug日志保存本地 using System.Collections; using UnityEngine; using System.IO; public class SaveLog : MonoBehaviour { private float length; Queue queue; private void Awake() { DontDestroyOnLoad(this); LogToFile("Version of the runtime: " + Application.unityVersion, true, false); Application.logMessageReceivedThreaded += OnReceiveLogMsg; queue = new Queue(); } // Start is called before the first frame update void OnReceiveLogMsg(string condition, string stackTrace, LogType type) { string _type = ""; switch (type) { case LogType.Error: _type = "error"; break; case LogType.Assert: _type = "Assert"