Unity在接入安卓的打开相册和相机时遇到了很多意想不到的问题。
首先,我用的是Unity 5.5.3p1,跟我以前用的4.x版本相差甚远,之前的jar,变成了aar,然后Android Studio没有怎么使用过,遇到了好多SDK方面的错误。
我把android 项目弄好了导出aar,导入Unity 中后又遇到了导不出apk的情况。这个问题解决完成后,测试不同的手机,结果发现小米的打开相册后会把原有的Activity注销掉,导致打开相册的重启。
实在是令人头疼的一系列事情。
小米手机还有一个存储图片的问题,这个问题是在裁剪完成后,先保存本地的一个临时文件,然后在用临时文件生成base64,传递给Unity。
这里和雨松MOMO的做法不同,雨松是裁剪完后存储到Unity 所访问的位置,我是直接传递base64了。
现小米打开相册后销毁原Activity 的问题还未解决。
最后打开相册或相机的代码,仅供参考:
Unity 路径问题
最近使用Handheld.PlayFullScreenMovie播放视频,因为不想放在StreamingAssets下导致包的大小太大。
所以,想着使用WWW下载存储在本地,记录存储路径,然后播放视频。测试后发现安卓是没有问题的,iOS路径不对。
一开始以为是设置权限问题,结果找了半天,还是没找到,然后把视频模块拆出来,单独测试,结果还是一样,最后发现是iOS路径前要加”file://“。
无法形容我的心情,WWW加载StreamingAssets下的配置文件时,也出现了路径问题,这个因为网上问的人比较多,所以很快找到了问题,也是路径前加”file:///“。
我还在想是不是iOS的Handheld.PlayFullScreenMovie不支持其他路径播放,我还是太单纯了。
下面是各个路径的分类:
加载StreamingAssets下的文件路径
12345678910public string dirPath =#if UNITY_ANDROID && !UNITY_EDITORApplication.streamingAssetsPath;#elif UNITY_IPHONE && !UNITY_EDITOR"file:///"+ Application.streamingAssetsPath;#elif UNITY_STANDALONE_WIN || UNITY_EDITOR"file:///" + Application.dataPath + "/StreamingAssets";#elsestring.Empty;#endif存储视频路径 和使用Handheld.PlayFullScreenMovie 播放存储视频路径
一般视频下载完后(WWW下载),我都存储在Application.persistentDataPath 下;
123456789101112131415public void CreateFile(byte[] bytes, string filePathName){Stream str;if (!File.Exists(filePathName)){FileInfo file = new FileInfo(filePathName);str = file.Create();//文件写入str.Write(bytes, 0, bytes.Length);//关闭并销毁流str.Close();str.Dispose();}}写入完成后,播放视频的路径:
12345678910public string dirPath =#if UNITY_ANDROID && !UNITY_EDITORApplication.persistentDataPath;#elif UNITY_IPHONE && !UNITY_EDITOR"file://"+ Application.persistentDataPath;#elif UNITY_STANDALONE_WIN || UNITY_EDITORApplication.persistentDataPath;#elsestring.Empty;#endif
下次如果遇到路径问题,第一时间要想到是否加”file://“ 或”file:///“。
生成不重复随机数组
C#生成不重复随机数组
这里主要是总结别人的方法,以备不时之需。
利用提高随机种子进行随机生成
1234567891011121314151617for (int i = 0; i < 5; i++){Random r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i);int num = r.Next(0, 1000);//随机生成一个整数string tempStr = string.Empty;for (int j = 0; j < 4; j++){r = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff")) + i + j);int x = r.Next(65, 90);//65-90代表A-Z的ASCII值char a = (char)x;tempStr += a.ToString();}Console.WriteLine("num" + i.ToString() + "的值是:" + num);Console.WriteLine("tempStr" + i.ToString() + "的值是:" + tempStr);}利用Hashtable
123456789101112Hashtable hashtable = new Hashtable();Random rm = new Random();int RmNum = 10;for (int i = 0; hashtable.Count < RmNum; i++){int nValue = rm.Next(100);if (!hashtable.ContainsValue(nValue) && nValue != 0){hashtable.Add(nValue, nValue);Console.WriteLine(nValue.ToString());}}使用Guid类生成随机数。还没弄清楚之前不推荐,测试结果并不好
12345678910public static int GetRandomNumber(int min, int max){int rtn = 0;Random r = new Random();byte[] buffer = Guid.NewGuid().ToByteArray();int iSeed = BitConverter.ToInt32(buffer, 0);r = new Random(iSeed);rtn = r.Next(min, max + 1);return rtn;}递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取,测试还是有重复。
12345678910111213141516171819202122232425Random ra=new Random(unchecked((int)DateTime.Now.Ticks));int[] arrNum=new int[10];int tmp=0;int minValue=1;int maxValue=10;for (int i=0;i<10;i++){tmp=ra.Next(minValue,maxValue); //随机取数arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中}public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){int n=0;while (n<=arrNum.Length-1){if (arrNum[n]==tmp) //利用循环判断是否有重复{tmp=ra.Next(minValue,maxValue); //重新随机获取。getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。}n++;}return tmp;}以产生100以内不重复的随机数为例,可以考虑先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,…),将该位置的数与最后一个位置的数对调就可以了。
123456789101112131415161718192021222324252627public static int[] GetRandomArray(int Number, int minNum, int maxNum){int j;int[] b = new int[Number];Random r = new Random();for (j = 0; j < Number; j++){int i = r.Next(minNum, maxNum);int num = 0;for (int k = 0; k <j;k++){if (b[k] == i){num = num + 1;}}if (num == 0){b[j] = i;}else{j = j - 1;}}return b;}
网上说当注重效率时,也可以使用字典,方法很多。Guid类这个还需要进一步研究了。
参考链接: http://www.cnblogs.com/programsky/p/5408697.html
http://www.jb51.net/article/66255.htm
http://www.cnblogs.com/AmatVictorialCuram/p/5426936.html
http://www.cnblogs.com/falla/archive/2010/01/29/1659399.html
http://www.manew.com/2843.html
http://bbs.csdn.net/topics/392005427?page=1
一个伪随机数生成算法:http://blog.csdn.net/yangsh3002/article/details/6180922
UGUI制作聊天
首先基础的是建一个Image,在Image下建一个Text。我这里聊天的左项和右项设置有些不同。
这样设置完成后的效果,是没有换行的。
所以在多文字需换行时,我会把文字的ContentSizeFitter的horizontalFit设置成ContentSizeFitter.FitMode.Unconstrained
RectTransform 的sizeDeta设置一个固定的宽。这样横向没有自适应宽度后,给定一个固定的宽度,Horizontal Overflow 设置成wrap,Vertical Overflow设置成Overflow,它就会自动换行。
这样一个大概的聊天就出来了。
Unity 遇到的一些小问题
这些问题都是工作中遇到的一些问题,现在来总结一下。工作中用到的是UGUI
(随机数的不重复)
- Text 首行缩进,使用全角空格(/U3000),还算是一种解决方法。
- 在写单例时,注意不要继承Monobehavior,容易出现问题。
Text 在文字赋值后,立刻获取preferredWidth属性,获取的值并不是总是正确的,但在协程中等待当前帧结束获取的值,会比较接近。
IEnumerator SetTextHeight()
{
yieldreturnnew WaitForEndOfFrame();
var width = ContentText.preferredWidth;
}在ScrollRect拖拽时,怎样判断向上还是向下拖拽?
OnEndDrag时,得到Content,根据content的LocalPosition的y值判定,>0 是向上拖拽,<0 是向下拖拽。ScrollView的深入了解
使用scrollview自动添加垂直项时,使用Vertical Layout Group和content size fitter 两个控件,其中content size fitter 的vertical fit 使用min size
Vertical Layout Group的child alignment 可以设置排列的对齐。UGUI 自适应
Rect Transform 的stretch 可以设置自适应,感觉很好玩。
同时点击shift和alt 又是另一种效果。这里没有截到图,哇,一开始都没注意呢。
- 背包的拖拽放置
背包的拖拽是在网上找到一种方法。
首先先摆好格子和拖拽项(当然拖拽项也可以动态生成),格子和拖拽项的tag分别设置为Grid 和 Item。
然后写一个DragAndDrop的代码(名称随意)给拖拽项,其中代码的内容如下:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556private static Transform canvasTra;private Transform nowParent;//一般来说,物品是格子的子物体,nowParent记录的是当前物品属于哪个格子private bool isRaycastLocationValid = true;//默认射线不能穿透物品public void OnBeginDrag(PointerEventData eventData){if (canvasTra == null) canvasTra = GameObject.Find("Canvas").transform;nowParent = transform.parent;transform.SetParent(canvasTra);//将当前拖拽的物品置前isRaycastLocationValid = false;}public void OnDrag(PointerEventData eventData){transform.position = Input.mousePosition;}public void OnEndDrag(PointerEventData eventData){GameObject go = eventData.pointerCurrentRaycast.gameObject;if (go != null){//Debug.Log(go.name);if (go.tag.Equals("Grid"))//放置到空格子{SetParentAndPosition(transform, go.transform);}else if (go.tag.Equals("Item"))//交换位置,注意可能需要把物品下的子物体的Raycast Target关掉{SetParentAndPosition(transform, go.transform.parent.parent);SetParentAndPosition(go.transform.parent, nowParent);}else{SetParentAndPosition(transform, nowParent);}}else{SetParentAndPosition(transform, nowParent);}isRaycastLocationValid = true;}private void SetParentAndPosition(Transform child, Transform parent){child.SetParent(parent);child.position = parent.position;}public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera){return isRaycastLocationValid;}
原理是当拖拽结束时,用射线判断是当前位置的物体的tag是拖拽项(Item)还是格子(Grid),如果是格子直接成为格子的子物体,如果是拖拽项,交换他们的父物体。
添加新菜单页面
1.在主题配置文件中,找到menu,添加想要添加的页面名称。
2.在menu_icons中设置图标,图标是Font Awesome图标的名字。
3.添加/修改翻译语言,这些翻译文本放置在 NexT 主题目录下的 languages/{language}.yml ({language} 为你所使用的语言)。
4.新建页面(在hexo文件夹下):hexo new page 页面名称
5.如果是tags(标签)页面,在hexo/source下会新生成一个新的文件夹tags,在该文件夹下会有一个index.md文件,在这个文件中添加type: “tags”
例:
-–
title: tags
date: 2016-11-15 19:10:05
type: “tags”
-–
6.当要为某一篇文章添加标签,只需在myBlog/source/_post目录下的具体文章的tags中添加标签即可
例:
-–
title: 基于Hexo和Github搭建博客
date: 2016-11-09
tags: [npm, hexo, github]
categories: 搭建博客
-–
参考页面:http://theme-next.iissnan.com/getting-started.html
http://blog.csdn.net/zuoziji416/article/details/53204478
http://fontawesome.dashgame.com/
Unity 打包apk遇到的一个问题
参考网站:http://stackoverflow.com/questions/42538433/not-finding-android-sdk-unity
错误:
1)Error:
Invalid command android
UnityEditor.HostView:OnGUI()
2)CommandInvokationFailure:
Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details.
C:/Program Files/Java/jdk1.8.0_121\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir=”C:/Users/great/AppData/Local/Android/Sdk\tools” -Dfile.encoding=UTF8 -jar “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar” -
stderr[
Error:Invalid command android
]
stdout[
]
exit code: 64
UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandInternal (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandSafe (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.HostView:OnGUI()
3)Error building Player:
CommandInvokationFailure: Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details.
C:/Program Files/Java/jdk1.8.0_121\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir=”C:/Users/great/AppData/Local/Android/Sdk\tools” -Dfile.encoding=UTF8 -jar “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar” -
stderr[
Error:Invalid command android
]
stdout[
]
exit code: 64
解决方法
重新下载一个Tools, http://dl-ssl.google.com/android/repository/tools_r25.2.5-windows.zip
替换原有SDK文件夹中的Tools就可以了,原有文件夹记得备份。
又出现了错误
CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
D:/Program Files/Java/jdk1.8.0_131\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir=”D:/Users/ppooh/AppData/Local/Android/sdk\tools” -Dfile.encoding=UTF8 -jar “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar” -
Error building Player: CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
D:/Program Files/Java/jdk1.8.0_131\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir=”D:/Users/ppooh/AppData/Local/Android/sdk\tools” -Dfile.encoding=UTF8 -jar “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar” -
这两个错误后面还有一长串,我在想是不是我以前的工程挪到这上的时候有问题。等明天我找个新工程来试一下。
参考:
unity调用安卓打包apk时的错误unable to convert classes into dex format
出现这种问题一般是由于有重复的文件所致,看下unity报的错误那些文件重复了,把重复的文件删了即可
例如,将eclipse中的安卓工程bin\class导出jar包时,会将下面的.class文件打包,但选中的.class unity中已经含有了,把这些文件删除就行了
参考:http://blog.csdn.net/mengfanye1991/article/details/40820781
创建新文章,提交到github的流程
最近买了一台PC,惠普暗夜精灵,除了偶尔死机,其他都挺好。
以前写的个人博客,想移植过来,着实费了一些功夫(主要好多东西都忘了)。
下面记录一下大概流程
1. 以前的Hexo压缩包下载
2. 安装Node.js和Git
3. 配置Github
- $ cd ~/. ssh 检查本机的ssh密钥
如果提示:No such file or directory 说明你是第一次使用git。
生成新的SSH Key: - $ ssh-keygen -t rsa -C “邮件地址@youremail.com”
Generating public/private rsa key pair.
Enter file in which to save the key(/Users/your_user_directory/.ssh/id_rsa):<回车就好>
注意1: 此处的邮箱地址,你可以输入自己的邮箱地址;注意2: 此处的「-C」的是大写的「C」
然后系统会要你输入密码:
Enter passphrase (empty for no passphrase):<输入加密串>
Enter same passphrase again:<再次输入加密串> - 添加SSH Key到GitHub
在本机设置SSH Key之后,需要添加到GitHub上,以完成SSH链接的设置。
1、打开本地C:\Documents and Settings\Administrator.ssh\id_rsa.pub文件。此文件里面内容为刚才生成人密钥。如果看不到这个文件,你需要设置显示隐藏文件。准确的复制这个文件的内容,才能保证设置的成功。
2、登陆github系统。点击右上角的 Account Settings—->SSH Public keys —-> add another public keys
3、把你本地生成的密钥复制到里面(key文本框中), 点击 add key 就ok了 - 测试是否配置成功 $ ssh -T git@github.com
- 设置用户信息
$ git config –global user.name “cnfeat”//用户名
$ git config –global user.email “cnfeat@gmail.com”//填写自己的邮箱
4. 重新安装hexo
在hexo压缩包解压后的文件夹中重新安装hexo: $ npm install -g hexo
5. 调试是否设置成功
hexo clean
hexo g
hexo s
6. 在博客文件夹重新克隆博客项目
git clone XX://XXX/XXX.XX.XX
7. 生成新文章
hexo new “文章名”
然后在sourse/_posts中找到生成的“文章名.md”
可以参考以前的教程改写
hexo g 生成
hexo d(这个我的理解是可要可不要,需进一步确认)
hexo s(localhost:4000)本地测试
8. 复制public的内容到博客文件夹
可手动复制,也可在git中复制(这个没有掌握)
9. 在博客文件夹中提交工程
git add .(或者知道新增的文件是那些,提交具体文件也可以)
git commit -m “版本记录”
git push -u origin master
10. 最后测试
可登录github 测试,也可等几分钟登录博客地址测试
PS:这个经验吧,应该不太适合大众,只适合我自己
参考:http://blog.csdn.net/poem_of_sunshine/article/details/29369785
改善情绪的正念疗法 4
改变情绪的正念疗法
引子
因为找工作的原因发现自己的情绪非常不稳定,所以去万能的知乎查找了相关方面的东西,结果找到了幸福课和改善情绪的正念疗法这两个东西,幸福课正在学习,就开始看改善情绪的正念疗法了。
看了大概有60页的内容了,写了三个笔记在Draft,家里网速不好,Draft需要实时联网,所以就想起来我的个人博客网站了。也是希望自己能够养成一个很好的阅读学习习惯。
7.18 重新开始阅读
缺乏觉察力使得我们看不见其他的可能性。
直接去体验
变化盲视
生活正以这种方式,在我们不知情的状况下一点一滴、时时刻刻地悄然溜走。总是想着要去某一个地方,却几乎不曾注意到我们此刻所处的风景,。我们总是以为,不论任何时间任何地点,只有去另外的某个地方,才会感到快乐。到那时候,我们才会“有时间休息”。于是,我们推迟了自己的快乐,没有向此刻的经验敞开怀抱。结果,我们就像错过了洗盘子和喝咖啡那样,错失了生活中每一刻展现出来的魅力。如果我们继续浑浑噩噩的话,也许还会以这种方式错过生活中大部分的色彩。
超越寻常的目标追求
行动模式就是通过锚定现实状态和理想状态之间的差异,来达到预定设定目标的一种模式。而存在模式而不考虑事物的现实善和我们希望它达到的状态。至少在原则上它没有任何需要完成的目标。这种非努力的倾向可以帮助我们从行动模式狭隘的目标追求中解脱出来。
接近而不是逃避
接近(approach)和逃避(avoidance)机制是一切生命系统和生物生存的基础。
正念的性质并非中性或者空白的状态。真正的正念是充满着温暖、热情和兴趣的。正念的本质就是关注:凡是有兴趣存在的地方,就会有自然而非强迫的注意跟随。
日常生活的正念
主要的方法就是对我们做的任何事情都进行温和的注意。不论我们做任何事情,都尽可能地用全新的、每时每刻的、非评价的觉察去面对它们。
我们要做的第一步就是辨认出自动思维出现的时刻,并且有意地用一种更加开阔、仁慈和智慧的觉察去面对它。
即使一个小小的正念也可以在某一刻打破抑郁的顽固锁链。
第4章 正念式呼吸和行走
觉察的入口
训练气定神闲
我们需要通过选择注意的点和注意的方式来实现上述目标。为了使这个策略奏效,我们还需要发展一定程度的动机和意向性,以防止被大脑根深蒂固的旧反应模式所摆布。
那些努力压抑负性思维的人最终会比不做任何努力的人感到更加抑郁。从类似的研究中,很多心理学家终于确认了冥想智慧早就指出的结论:试图压抑不想要的念头并不是让头脑冷静而澄明的有效方法。
注意此时此地所发生的事情,需要的是意志,而不是强制力。
意志什么时候优于强制力
传统上,我们常常把开发头脑的稳定情绪的能力比喻成处理一杯泥水。如果你不断搅拌这杯水,那么它永远都是浑浊的。但是如果你耐心地等待,那么泥土最终会沉到杯底,留下干净纯洁的水浮在上面。同样地,如果我们试图稳定、控制思维,那么只能把事情搅乱,让一切变得更加浑浊。但是如果我们让大脑专注于某件事情,那么或许可以摆脱上述的思维模式。当我们有意识地放弃控制事物的努力,头脑就会自动地安静下来,留给我们更加冷静而澄明的空间。
正念式呼吸
当头脑被想法、感受、身体感觉以及外部的分心物吸走时,我们将很难保持对呼吸的觉察。但是,如果我们能够把思维的波动理解成“大脑在做的某件事”,那么情况可能会相对容易些——就像看待水面的波澜那样平常。如果我们把思维的波动看成是自然而不可避免的事,那么注意在意识中的来去就是练习的核心部分,而不是偏离或者背道而驰了。从中我们可以学到一些必须的知识:觉察出行动模式的出现,摆脱行动模式,然后进入存在模式。
不需要任何陈规戒律,也不需要达到任何特定的目标。尽量让生活顺其自然,不需要有任何标新立异。
尽量宽容地对待我们的觉察,把思维的游离看成培养耐心和宽容的机会,对生活报以更大的慈悲和同情。
意料之外的宁静
正念式冥想是一种对当前状态的积极回应,让我们从沉思式思维的本能反应中解脱出来。
应对思维的游离
由发现到期待
我们与其把这些目标驱动和批判性的思维当做“崩溃”的理由,不如把它们看成是一种提醒,告诉我们“实现某个目标”或者“取得进步”的口号很容易让我们陷入抑郁。这样,我们才能像第2章中描述的那样,把思维和情绪仅仅当做思维和情绪来对待,——认识到它们既不准确也没有特别的帮助。
接受思维的游离,重新开始
挣扎得最痛苦的时刻正是能够学到最多东西的时刻。在重新开始的那一刹那,虽然你的内心还在争扎,但你会体验到片刻的欢愉,那是一种回家的熟悉感或者是认出某个老朋友的欣喜之情。然后,这种感觉能够唤醒好奇心和冒险意识,让我们在想放弃的时候仍然有勇气继续坚持下去。
顺其自然:放弃控制
专注地呼吸:感受此刻
如果我们有意地把精力集中于眼前的事,那么就会有力量去完成当前的任务。
正念式行走
如果这些生理运动能够伴随着觉察和有意的注意转换,那么它们都可以是潜在的正念练习。行走式冥想是在运动中培养正念的有效方式
在行走中学习
在同一条路上单纯地来回行走,——象征着一个主题:“不需要去任何地方,不需要做任何事,不需要争取任何东西”。你只需要单纯地活在当下,关注着眼前的这一步。
从无觉察到觉察
我们进行正念式的呼吸或者行走的练习是为了获得更多的觉察,而不是为了清空思想或者其他的东西。心智的明晰和平和是这种觉察的产物,是让事物顺其自然的产物,如果我们把一时的平静作为进步的标志,把一时的烦躁作为退步的标志,那么我们只是在播撒挫败和绝望的种子,让行动模式把“成果”和某些目标又做了一次比较而已
只要我们仍执着于摆脱郁闷的想法,或者试图获得心灵的平静,那么我们就会一直挫败下去。
正念练习的目的不是去强行控制思想,而是去知觉健康或有害的思维模式。它让我们的心智和身体达到一种好奇、开放和接受的状态,让我们活在当下,不再做无意义的挣扎。通过这种方式,我们可以一点一滴地从旧的思维模式中解脱出来。我们会开始明白自己要做的正是眼前的事情。我们将会慢慢实现从无觉察到觉察状态的优雅转身。