分类 Unity 下的文章

Unity常见插件汇总

介绍

收集了相关的Unity插件,供大家学习使用,如果用于商业活动,请购买相关版权

插件列表

1. A* Pathfinding Project

一个功能强大并且易于使用的 Unity 寻路系统。通过快速的路径寻找,将在点对点之间找到最合适的路径解决方案

2. Behavior Designer

适合于不仅仅是程序员使用也适合于产品+设计师,Behavior Designer 提供具有强大的 API 的直观可视化编辑器,帮您轻松创建新任务

3. DOTween Pro

可以用极少的代码处理复杂的动画效果,替代了我们在协程或者在Update里面撰写大量的逻辑控制代码

4. Easy Save

在实际开发中我们需要储存各种类型的数据,并想要数据得到保护,那么EasySave绝对是为这些需求量身定做的

5. Lean Touch

为手指触摸控制你的游戏提供极其简单的解决方案,这让你可以快速添加触摸控制到你的游戏-无需代码

6. Playmaker

这是unity3d最好的一款可视化编辑器,突破了非程序员止步于开发任务的障碍

7. Cross Platform Replay Kit

能在移动设备iOS和Android上轻松进行屏幕录制,可以在 Unity 上对你的游戏和其他你想要录制记录的画面轻松进行屏幕录制

8. BestHttp

提供包括Websock,Socket.IO,SignalIR,download/upload等特性。适合于大型网络游戏/项目,网络联机游戏项目

9. UFPS

快速构建FPS的模板项目
提取码:nyj6

10. Photon PUN+

是一款制作多人联机游戏的插件,同时支持PC端、手机端和网页端的Unity项目

11. Ultimate Inventory System

制作背包仓储系统的最佳插件
提取码:7eu5

12. Obfuscator

可以保护游戏代码和游戏资源,防止被逆向工程破解

13. Anti-Cheat Toolkit

保护游戏数据,免于被某些玩家作弊

14. SALSA LipSync Suite

一款制作唇语同步&面部动画的插件

15. Edy's Vehicle Physics

可以为赛车类游戏提供各种逼真的真实物理效果

16. Editor Console Pro

取代Unity原生控制台编辑器的插件,生产力提升必备插件

17. Odin - Inspector and Serialize

一款可视化编程插件,可以让开发者序列化任何内容

18. I2 Localization

unity功能最全的本地化插件,可以本地化图片、文字、声音、图集、预设等资源

19. Rewired

可以帮助开发者轻松处理各种外设的输入,以控制游戏世界

20. Loxodon Framework Bundle

一个非常好用的AssetBundle加载器,也是一个AssetBundle冗余分析工具

21. QHierarchy

增强Hierarchy窗口的功能,极大提升开发效率

22. Koreographer Professional Edition

制作音乐节拍类游戏的必备神器

23. Master Audio

是Unity游戏开发的终极音频解决方案

24. Final IK

反向动力控制插件

25. PuppetMaster

高级的活跃布娃娃物理系统,带有布娃娃创建和编辑工具

26. Curved UI

资源商店中唯一真正的曲线界面系统

27. VR Interaction Framework

借助 VR 交互框架,轻松创建属于自己的可交互对象并迅速上手
提取码:kvse

28. Amplify Shader Editor

一款基于节点的可视化shader制作插件

29. Octave3D-Level Design

帮助Unity开发者制作关卡

30. Mesh Baker

用来合并Mesh和Materials,这样可以降低游戏对内存和显卡的消耗

31. Corgi Engine

一款制作2D/2.5D的平台游戏引擎,内部集成了若干有趣的游戏
提取码:jydg

32. Doozy UI Manager

Unity内部的一个UI管理插件
提取码:bbik

33. Fantasy Environment

包含了大量的幻想风格的游戏素材
提取码:xyqs

34. MapMagic World Generator

一款基于节点制作地形的插件
提取码:ssvw

35. TopDown Engine

Unity 最完善的自上而下解决方案
提取码:e5x7

36. Dynamic Bone

可给角色骨骼和关节增添物理效果

37. Feel

可以增加游戏感觉的插件
提取码:d341

38. Text Animator for Unity

让对话变得活泼,借助这一简单易用的自定义插件将游戏文本动画化

39. Dialogue System for Unity

可在游戏中轻松添加互动式对话和任务

40. Adventure Creator

帮助你制作传统的 2D、2.5D 和 3D 冒险游戏

41. All In 1 Vfx Toolkit

快速简单的创建出VFX
提取码:khgj

42. RPG Character Mecanim Animation Pack

1320个漂亮又专业的动画, 可兼容Xbox360游戏手柄, 以及基于物理学的人物控制器脚本

43. The Vegetation Engine

植物渲染资源包
提取码:m37x

44. Emerald AI

快速创建AI
提取码:noik

45. Enviro - Sky and Weather

非常好用的天气资源
提取码:mmat

46. UMMORPG

Unity最好的RPG游戏模板项目
提取码:y87r

47. UMOBA

Unity最好的MOBA游戏模板项目

最近项目中接了一个第三方的SDK,SDK的提供方为了能让开发人员在xcode模拟器下也可以运行调试,所以在一些framework中包含了x86_64框架,可是如果打iOS包的话,这里可以通过把“Validate Workspace”设置为“YES”来解决打包报错的问题,可以正常出包了。(“Validate Workspace”的设置请参考下图)
2022-10-10T02:48:33.png

但是新的问题出现了,就是在苹果后台上传包里会报错,如下:

Asset validation failed (90087)
Unsupported Architectures. The executable for XXXX.app/Frameworks/AgoraRtcWrapper.framework contains unsupported architectures '[x86_64]'. (ID: 643f96cf-cd6b-4ad6-bc53-ebb77eab54dd)

说这个库里包含了不支持的框架,上传失败,此时我们需要做的是,把这个x86_64的框架从这个framework中删除,再重新打包;

在mac下,我们可以直接使用lipo -info 来查看framework包含哪些框架,例如上面这个

 lipo -info AgoraRtcWrapper.framework/AgoraRtcWrapper

会输出

AgoraRtcWrapper.framework/AgoraRtcWrapper are: armv7 x86_64 arm64 

可以看到确实包含了x86_64框架,那如何删除x86_64框架呢?还是用lipo命令,如下:

lipo -remove x86_64 AgoraRtcWrapper.framework/AipBase -o AgoraRtcWrapper.framework/AipBase

这样就可以把x86_64删除之后,再写回到原来的路径,最后我们再查看一下删除了x86_64的库,如下:

AgoraRtcWrapper.framework/AgoraRtcWrapper are: armv7 arm64

这里只剩下了armv7 arm64了。重新打包,这里已经不需要把“Validate Workspace”设置为“YES”了,打包后,上传,一次通过。

在要Unity Editor下查找一个资源,是否被其它预制(prefab)引用,AssetDatabase并没有给出现成的API,AssetDatabase只能查找一个游戏对象依赖了哪些资源,我们可以在启动的时候,使用AssetDatabase对每个资源建议反向索引,再进行查找,但是建议反向索引的过程还是比较耗时的,项目越大,资源越多,耗时越久。
这样的方式虽然能达到查找资源被依赖的目的,但是还不够高效,下面我们讲一下,在Mac系统下,使用系统索引的方式,快速进行资源被依赖的方法,可以在1秒内,找到资源的被依赖对象,因为Mac系统已经为文件建立好了索引,所以可以直接使用,以下是已经集成好的代码工具,可以拷贝到项目里直接使用,上代码:

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class FindProject
{
#if UNITY_EDITOR_OSX
    private static string _curFileName;
    private static readonly List<string> References = new List<string>();

    private static bool _canOutResult;
    private static string _selectedAssetPath;
    
    [MenuItem("Assets/Find References In Project", false, 2000)]
    private static void FindProjectReferences()
    {
        var appDataPath = Application.dataPath;
        _selectedAssetPath = AssetDatabase.GetAssetPath(Selection.activeObject);
        

        _curFileName = Path.GetFileName(_selectedAssetPath);

        var guid = AssetDatabase.AssetPathToGUID(_selectedAssetPath);

        var psi = new System.Diagnostics.ProcessStartInfo
        {
            WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized,
            FileName = "/usr/bin/mdfind",
            Arguments = "-onlyin " + Application.dataPath + " " + guid,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };
        
        EditorApplication.update += OnUpdate;

        var process = new System.Diagnostics.Process();
        process.StartInfo = psi;

        process.OutputDataReceived += (sender, e) =>
        {

            if (string.IsNullOrEmpty(e.Data))
            {
                _canOutResult = true;
            }
            else
            {
                var fileName = Path.GetFileName(e.Data);

                if (fileName.Contains(_curFileName))
                {
                    return;
                }

                var relativePath = "Assets" + e.Data.Replace(appDataPath, "");
                References.Add(relativePath);
            }

        };
        process.ErrorDataReceived += (sender, e) =>
        {
            if (string.IsNullOrEmpty(e.Data))
                return;

            // output += "Error: " + e.Data + "\n";
        };
        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
    }
    
    private static void OnUpdate()
    {
        if (!_canOutResult) return;
        _canOutResult = false;
        
        var rawObj = AssetDatabase.LoadAssetAtPath<Object>(_selectedAssetPath);
        Debug.Log($"<color=aqua><b>{References.Count}</b></color> 个对象引用了 <color=fuchsia><b>{_curFileName}</b></color>", rawObj);
        
        foreach (var file in References)
        {
            var findObj = AssetDatabase.LoadAssetAtPath<Object>(file);
            Debug.Log( $"<color=lime>引用者:</color> <color=yellow>{file}</color>", findObj);
        }
    }

#endif
}