进口fbx角色动画read-only解

进口fbx角色动画read-only解

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

原文链接:
http://answers.unity3d.com/questions/8172/how-to-add-new-curves-or-animation-events-to-an-im.html

unity4.3版本号

方法1:

You can use an editor script that copies over the curves from the original imported Animation Clip into the duplicated Animation Clip.

Here is such an editor script.

  • Place it in a folder called Editor, located somewhere inside the Assets folder.
  • The script assumes that you have already made a duplicate of the imported clip and called it the same name but with a *copy postfix. For example, if you have an imported clip called MyAnimation, it will search for *MyAnimation_copy*.
  • Select the original imported Animation Clip in the Project View.
  • You can now use the menu Assets -> Transfer Clip Curves to Copy

And the script:


  
  
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.Collections;
  4.  
  5. public class CurvesTransferer {
  6.  
  7. const string duplicatePostfix = "_copy";
  8.  
  9. [MenuItem ("Assets/Transfer Clip Curves to Copy")]
  10. static void CopyCurvesToDuplicate () {
  11. // Get selected AnimationClip
  12. AnimationClip imported = Selection.activeObject as AnimationClip;
  13. if (imported == null) {
  14. Debug.Log("Selected object is not an AnimationClip");
  15. return;
  16. }
  17.  
  18. // Find path of copy
  19. string importedPath = AssetDatabase.GetAssetPath(imported);
  20. string copyPath = importedPath.Substring(0, importedPath.LastIndexOf("/"));
  21. copyPath += "/" + imported.name + duplicatePostfix + ".anim";
  22.  
  23. // Get copy AnimationClip
  24. AnimationClip copy = AssetDatabase.LoadAssetAtPath(copyPath, typeof(AnimationClip)) as AnimationClip;
  25. if (copy == null) {
  26. Debug.Log("No copy found at "+copyPath);
  27. return;
  28. }
  29.  
  30. // Copy curves from imported to copy
  31. AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(imported, true);
  32. for (int i=0; i<curveDatas.Length; i++) {
  33. AnimationUtility.SetEditorCurve(
  34. copy,
  35. curveDatas[i].path,
  36. curveDatas[i].type,
  37. curveDatas[i].propertyName,
  38. curveDatas[i].curve
  39. );
  40. }
  41.  
  42. Debug.Log("Copying curves into "+copy.name+" is done");
  43. }
  44. }

方法2:

There is more simple variant. This script creates a new animation file itself and makes all copying operations.



  
  
  1. using UnityEditor;
  2. using UnityEngine;
  3.  
  4. public class CurvesTransferer
  5. {
  6. const string duplicatePostfix = "_copy";
  7.  
  8. static void CopyClip(string importedPath, string copyPath)
  9. {
  10. AnimationClip src = AssetDatabase.LoadAssetAtPath(importedPath, typeof(AnimationClip)) as AnimationClip;
  11. AnimationClip newClip = new AnimationClip();
  12. newClip.name = src.name + duplicatePostfix;
  13. AssetDatabase.CreateAsset(newClip, copyPath);
  14. AssetDatabase.Refresh();
  15. }
  16.  
  17. [MenuItem("Assets/Transfer Clip Curves to Copy")]
  18. static void CopyCurvesToDuplicate()
  19. {
  20. // Get selected AnimationClip
  21. AnimationClip imported = Selection.activeObject as AnimationClip;
  22. if (imported == null)
  23. {
  24. Debug.Log("Selected object is not an AnimationClip");
  25. return;
  26. }
  27.  
  28. // Find path of copy
  29. string importedPath = AssetDatabase.GetAssetPath(imported);
  30. string copyPath = importedPath.Substring(0, importedPath.LastIndexOf("/"));
  31. copyPath += "/" + imported.name + duplicatePostfix + ".anim";
  32.  
  33. CopyClip(importedPath, copyPath);
  34.  
  35. AnimationClip copy = AssetDatabase.LoadAssetAtPath(copyPath, typeof(AnimationClip)) as AnimationClip;
  36. if (copy == null)
  37. {
  38. Debug.Log("No copy found at " + copyPath);
  39. return;
  40. }
  41. // Copy curves from imported to copy
  42. AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(imported, true);
  43. for (int i = 0; i < curveDatas.Length; i++)
  44. {
  45. AnimationUtility.SetEditorCurve(
  46. copy,
  47. curveDatas[i].path,
  48. curveDatas[i].type,
  49. curveDatas[i].propertyName,
  50. curveDatas[i].curve
  51. );
  52. }
  53.  
  54. Debug.Log("Copying curves into " + copy.name + " is done");
  55. }
  56.  
  57. }

方法3:

Guys, I loved this script so much, I went ahead and added a couple of features.

Here is a modified version of MaDDoX’s edit that includes logic for automatically placing the animations into folders.

It first uses an animations folder to contain them all and then if the animation came from an FBX file, it will use the FBX’s name to create a subfolder for those animations. Hopefully, this helps y’all keep things organized.



  
  
  1. using UnityEditor;
  2. using UnityEngine;
  3.  
  4. using System.IO;
  5. using System.Collections;
  6.  
  7. public class MultipleCurvesTransferer {
  8. const string duplicatePostfix = "Edit";
  9. const string animationFolder = "Animations";
  10.  
  11. static void CopyClip(string importedPath, string copyPath) {
  12. AnimationClip src = AssetDatabase.LoadAssetAtPath(importedPath, typeof(AnimationClip)) as AnimationClip;
  13. AnimationClip newClip = new AnimationClip();
  14. newClip.name = src.name + duplicatePostfix;
  15. AssetDatabase.CreateAsset(newClip, copyPath);
  16. AssetDatabase.Refresh();
  17. }
  18.  
  19. [MenuItem("Assets/Transfer Multiple Clips Curves to Copy")]
  20. static void CopyCurvesToDuplicate()
  21. {
  22. // Get selected AnimationClip
  23. Object[] imported = Selection.GetFiltered(typeof(AnimationClip), SelectionMode.Unfiltered);
  24. if (imported.Length == 0)
  25. {
  26. Debug.LogWarning("Either no objects were selected or the objects selected were not AnimationClips.");
  27. return;
  28. }
  29.  
  30. //If necessary, create the animations folder.
  31. if (Directory.Exists("Assets/" + animationFolder) == false) {
  32. AssetDatabase.CreateFolder("Assets", animationFolder);
  33. }
  34.  
  35. foreach (AnimationClip clip in imported) {
  36.  
  37.  
  38.  
  39. string importedPath = AssetDatabase.GetAssetPath(clip);
  40.  
  41. //If the animation came from an FBX, then use the FBX name as a subfolder to contain the animations.
  42. string copyPath;
  43. if (importedPath.Contains(".fbx")) {
  44. //With subfolder.
  45. string folder = importedPath.Substring(importedPath.LastIndexOf("/") + 1, importedPath.LastIndexOf(".") - importedPath.LastIndexOf("/") - 1);
  46. if (!Directory.Exists("Assets/Animations/" + folder)) {
  47. AssetDatabase.CreateFolder("Assets/Animations", folder);
  48. }
  49. copyPath = "Assets/Animations/" + folder + "/" + clip.name + duplicatePostfix + ".anim";
  50. } else {
  51. //No Subfolder
  52. copyPath = "Assets/Animations/" + clip.name + duplicatePostfix + ".anim";
  53. }
  54.  
  55. Debug.Log("CopyPath: " + copyPath);
  56.  
  57. CopyClip(importedPath, copyPath);
  58.  
  59. AnimationClip copy = AssetDatabase.LoadAssetAtPath(copyPath, typeof(AnimationClip)) as AnimationClip;
  60. if (copy == null)
  61. {
  62. Debug.Log("No copy found at " + copyPath);
  63. return;
  64. }
  65. // Copy curves from imported to copy
  66. AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(clip, true);
  67. for (int i = 0; i < curveDatas.Length; i++)
  68. {
  69. AnimationUtility.SetEditorCurve(
  70. copy,
  71. curveDatas[i].path,
  72. curveDatas[i].type,
  73. curveDatas[i].propertyName,
  74. curveDatas[i].curve
  75. );
  76. }
  77.  
  78. Debug.Log("Copying curves into " + copy.name + " is done");
  79. }
  80. }
  81. }

….

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117386.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 退出卸载360、QAX 天擎,无需密码

    退出卸载360、QAX 天擎,无需密码退出卸载360、QAX天擎,无需密码天擎企业版,退出和卸载是需要管理员密码进入360天擎,点击设置=>防护中心=>自我保护功能,去掉勾选,确认\360Safe\EntClient\conf\EntBase.dat目录目录查找:在桌面右下角找到天擎应用程序右键,进入程序安装位置,即可进入安装目录EntBase.dat文件删除uipassqtpass两行=后面的两个字符串即可关闭退出卸载密码。这里如果没有权限无法修改,先将EntBase.dat复制到其他文件夹(

    2022年9月24日
  • pycharm pyinstaller打包exe_pip安装第三方库失败

    pycharm pyinstaller打包exe_pip安装第三方库失败1.安装时打开AnacondaPrompt,然后cdD:\Anaconda3\pkgs打开路径,输入安装命令:pipinstallPyInstaller。最后输入piplist查看2.调出terminal终端,输入命令例如pyinstaller-F-wvipvideoplay2.py点击回车如图:输入指定命令后会在当前目录下生产dist文件夹,dist文件夹下为生成的exe文件参数说明:-F:将所有库文件打包成一个exe-w:隐藏黑色控制台窗口如果不加-F参数会生成很多文

    2022年8月27日
  • Zabbix 监控Redis

    Zabbix 监控Redis网上有大量zabbix监控redis的文章,但大多数不详细,而我按一下方法成功了,所以转载了此博主的文章此按照以下配置好后,会遇到一个问题:后查明是由于监控shell脚本格式问题请按:http://www.2cto.com/os/201305/215945.html 处理shell脚本和模版看文章的最下面一、配置zabbix插件

    2022年6月11日
  • python实现excel转json的例子[通俗易懂]

    python实现excel转json的例子[通俗易懂]python实现excel转json的例子(改进版)由于数值策划给出数值是excel表格,但前台flash程序用的又是json格式。服务器也用了json格式,而json又是utf-8编码的,用C++实现,太痛苦。鉴于此,尝试用python实现看看。没想到,python实现确实很简单,一个多小时搞定(有搜索事半功倍啊)。今天我又对它做了一点改进。主要1、是支持float和多表格;2、在exc…

    2022年5月24日
  • flowerplus鲜花官网_花艺大师作品

    flowerplus鲜花官网_花艺大师作品题目描述 Description花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。具体而言,栋栋的花的高度可以看成一列整数h_1,h_2,…,h_n。设当一部分花被移走后,剩下的花的高度依次为g_1,g_2,…,g_m,则栋栋希望下

    2022年8月22日
  • 【实战】工作中常用的PHP 操作 Redis 的基本方法「建议收藏」

    【实战】工作中常用的PHP 操作 Redis 的基本方法

    2022年2月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号