1. unity会自动编译脚本吗
会的 当写好脚本后保存回到unity界面右下角会有个小圈在转 并会卡一下 这就是unity在编译脚本
2. Unity3d:在屏幕边缘显示其他玩家/敌人/物体的方位
IOS:
IOS:使用shell命令打包并上传Itunes
Unity3d:
Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot)
Unity3d:在屏幕边缘显示其他玩家方位
Unity3d:命令行打包android
Unity3d:命令行编译IOS
Unity3d:使用Jenkins自动编译打包IOS(只能打包Development)
Unity3d:使用Jenkins自动编译打包IOS(打包Ad-hoc,上传itunes)
需要注意两个点x坐标相等的情况:
如果两个点x坐标相等,则该直线与y轴平行;
如果两个点y坐标相等,则该直线与x轴平行;
如果两个点x,y坐标都相等,则不是线,是同一个点。
需要注意a1和a2相等的情况:
如果a1和a2相等,b1和b2不相等,则两条直线平行,无交点;
如果a1和a2相等,b1和b2相等,则两条直线是同一条线,无交点;
如果a1和a2不相等,b1和b2相等,则两条直线不平行,有交点,相交于y轴b1点或b2点;
如果a1和a2不相等,b1和b2不相等,则两条直线不平行,有交点。
注意是 线段 ,不是直线。
通过(1)求得端点所在的直线的方程;
通过(2)求得这两条直线的交点。
这里需要判断下交点是落在线段内,还是线段外(虚交点):
如果交点x坐标小于线段1的左侧端点的x坐标,或者交点x坐标大于线段1的右侧端点的x坐标,则该交点落在线段1外,即线段的延长线上,是个虚交点。
反之,是线段1的正常交点。
Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot)
首先,playerA是一定在屏幕内的,这里需要判断playerB是不是在屏幕内。
如果playerB是在屏幕内,则无需后面的处理。
如果playerB是在屏幕外,让我们继续。
然后,把playerA和playerB的世界坐标转换成屏幕坐标系里的坐标,分别记作A和B。
注意 :这里有个容易钻进去的误区,就是很容易想到去计算方向向量,即( BA )。计算完之后又会自然而然的想着用这个向量去处理上面的问题,最后会发现,自己已经进入了一个深坑里,深深的把自己的思维给圈住了,即使偶尔换个方向思考,比如求交点的方式,还是容易被这个向量给迷惑,总想着去用这个向量去解决,尽管这个向量在这个方式里没啥卵用。
这时,因为A点在屏幕内,B点在屏幕外,所以线段AB一定与屏幕的某一个边框有一个交点( 实交点,非虚交点 )。
这个交点的位置就是我们需要放置方位指示器UI的位置了。
注 :实交点,即交点位于线段上;虚交点,即交点位于线段的延长线上。
屏幕有4个边框,所以我们要先找出这四个边框线段各自拥有的端点坐标。
这里需要注意,A和B两个点是在屏幕坐标系上,线段AB与屏幕边框的交点也是位于屏幕坐标系上。
而方位指示器UI是放在Canvas上的,位于Canvas坐标系内。
所以在计算之前要先做坐标系转换。
这里有两个转换方式:
注意:后面用到的知识在文章 Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot) 中有详细说明,遇到问题可自行查阅。
先把A点和B点转换到Canvas的坐标系内:
cA = (A.x * Canvas.Width / Screen.Width, A.y * Canvas.Height / Screen.Height)
cB = (B.x * Canvas.Width / Screen.Width, B.y * Canvas.Height / Screen.Height)
再找出Canvas的四个边框线段对应的端点(左下角是原点):
左侧边框端点:lbP(0, 0) 、ltP(0, Canvas.Height) ;
底部边框端点:lbP(0, 0) 、rbP(Canvas.Width, 0) ;
右侧边框端点:rbP(Canvas.Width, 0) 、rtP(Canvas.Width, Canvas.Height) ;
顶部边框端点:ltP(0, Canvas.Height) 、rtP(Canvas.Width, Canvas.Height) ;
有了线段cAcB和Canvas的四个边框线段,根据上面的数学知识,可以轻松求得线段cAcB与Canvas某一个边框的交点,我们记作点P。此时点P位于Canvas的坐标系内。
最后把方位指示器UI在P点显示出来即可。在文章 Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot) 的最后有相关知识,请自行查阅 _ 。
现在线段AB的两个端点有了(即A、B点),下面再找出屏幕的四个边框线段对应的端点(左下角是原点):
左侧边框端点:lbP(0, 0) 、ltP(0, Screen.Height) ;
底部边框端点:lbP(0, 0) 、rbP(Screen.Width, 0) ;
右侧边框端点:rbP(Screen.Width, 0) 、rtP(Screen.Width, Screen.Height) ;
顶部边框端点:ltP(0, Screen.Height) 、rtP(Screen.Width, Screen.Height) ;
有了线段AB和屏幕的四个边框线段,根据上面的数学知识,可以轻松求得线段AB与屏幕某一个边框的交点,我们记作点P。此时点P位于屏幕的坐标系内。
然后把交点P转换到Canvas的坐标系内:
cP = (P.x * Canvas.Width / Screen.Width, P.y * Canvas.Height / Screen.Height)
最后把方位指示器UI在cP点显示出来即可。在文章 Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot) 的最后有相关知识,请自行查阅 _ 。
3. Unity 命令行
1 运行程序,先cmd进入相应的unity 版本的安装目录下的Editor文件夹下。
1.1 unity.exe -projectPath xxx 打开xxx路径程序
1.2 unity.exe -buildTarget iOS 切换平台等等
1.3 unity xxx -executeMethod xxx.xx 调用程序的xx类的xx方法 方法必须是静态的,类必须要放在Editor下
1.4 unity -quit xxxx..... 是执行完完退出程序
1.5 重要点 GetCommandLineArgs
如何传递参数 其实很简单 直接在 后面跟上 GetCommandLineArgs xxx参数就可
但是在unity中要用响应的方法接收
String[] arguments = Environment.GetCommandLineArgs();
arguments []数组就是传递 的参数,
完整的例子:
unity.exe -quit -projectPath XXX -buildTarget Win64 -executeMethod 类名. 方法名 GetCommandLineArgs android
XXX是项目路径
4. unity按播放器显示编译器错误,怎么解决
unity按播放器显示编译器错误解决的步骤:
1、找到文件所在位置。
2、step1删了此文件。
3、step2重新打开unity文件可自动生成。
5. Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot)
IOS:
IOS:使用shell命令打包并上传Itunes
Unity3d:
Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot)
Unity3d:在屏幕边缘显示其他玩家方位
Unity3d:命令行打包Android
Unity3d:命令行编译IOS
Unity3d:使用Jenkins自动编译打包IOS(只能打包Development)
Unity3d:使用Jenkins自动编译打包IOS(打包Ad-hoc,上传itunes)
所有的UI都有一个Root Canvas,该Canvas的RectTransform不可修改。
所有 Canvas坐标系 方向都是 右侧为X轴正方向 , 上方为Y轴正方向 。
该Canvas还带有一个 Canvas Scaler 组件,可以通过该组件适配不同的屏幕分辨率。
Canvas Scaler 中有一个 UI Scale Mode 属性,用于确定画布中的UI元素如何缩放。
以下假如屏幕分辨率为1500 * 3000。
使Canvas宽高保持与屏幕分辨率一致。屏幕分辨率有多大,Canvas宽高就有多大( Scale Factor 缩放因子为1时)。
所以, Canvas宽高 = 屏幕分辨率 / 缩放因子 。
使Canvas的宽高比与屏幕分辨率的宽高比保持一致。
缩放时需要基于下面的 Reference Resolution(参考分辨率) 进行缩放。
因为此时屏幕分辨率的宽高比为:1500 / 3000 = 0.5,所以在该模式下,无论怎么调整参数,Canvas宽高比也一直为0.5,不会变。
所以, Canvas宽高比 = 屏幕分辨率宽高比 。
缩放时用的参考分辨率。
下面假设参考分辨率是1080 * 1920。
如果屏幕分辨率与参考分辨率的宽高比不一致,则根据选择的模式对Canvas宽高进行缩放。
如果屏幕分辨率与参考分辨率的宽高比一致,该选项怎么调都不管用。
基于下面 Match 对Canvas宽高进行缩放。
缩放后,Canvas的宽高一定不低于参考分辨率的宽高。
缩放后,Canvas的宽高一定不高于参考分辨率的宽高。与 Expand 类似。
锚点说难不难,只是不好描述,但可以用例子来说明。
假如Canvas拥有一个Image节点。
对于 Image所在的坐标系 , 坐标系方向与Canvas坐标系方向相同 。
下面看下Image节点的 锚点在Canvas的不同位置 的情况:
单锚点 ,从Unity上看,就是4个小三角形聚在一个点。
单锚点在Canvas的位置(假设为点p) 都满足以下逻辑:
可以总结出以下公式(p为单锚点在Canvas的位置,pivot为单锚点的Pivot属性):
Image所在坐标系 原点在Canvas中的坐标 = (p.x + Image.Width * (0.5 - pivot.x), p.y + Image.Height * (0.5 - pivot.y)) 。
双锚点 ,从Unity上看,就是2个小三角形聚在一个点。
左上角有2个小三角形,左下角有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用 。
Image的Height = (Canvas.Height - Top - Bottom) / 2 。
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width * (0.5 - Pivot.x) + PosX , Image.Height / 2 + Top) 。
底部边框的中心有2个小三角形,顶部边框的中心有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用 。
Image的Height = (Canvas.Height - Top - Bottom) / 2 。
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width * (0.5 - Pivot.x) + Canvas.Width / 2 + PosX , Image.Height / 2 + Top) 。
右上角有2个小三角形,右下角有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用 。
Image的Height = (Canvas.Height - Top - Bottom) / 2 。
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width * (0.5 - Pivot.x) + Canvas.Width + PosX , Image.Height / 2 + Top) 。
左上角有2个小三角形,右上角有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用 。
Image的Width = (Canvas.Width - Left - Right) / 2 。
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width / 2 + Left , Image.Height * (0.5 - Pivot.x) + PosY) 。
左侧边框的中心有2个小三角形,右侧边框的中心有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用 。
Image的Width = (Canvas.Width - Left - Right) / 2 。
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width / 2 + Left , Image.Height * (0.5 - Pivot.x) + Canvas.Height / 2 + PosY) 。
左下角有2个小三角形,右下角有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用 。
Image的Width = (Canvas.Width - Left - Right) / 2 。
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width / 2 + Left , Image.Height * (0.5 - Pivot.x) + Canvas.Height + PosY) 。
四锚点 ,从Unity上看,就是4个小三角形全都是分散的( 左下角、左下角、右上角、右下角 )。
此时,Image拥有 Left,Top,Right,Bottom 这四个位置参数。
而且, 锚点的Pivot不起作用 。
Image的Width = (Canvas.Width - Left - Right) / 2 。
Image的Height = (Canvas.Height - Top - Bottom) / 2 。
如果设置Image的Left,Top,Right,Bottom都为0的话,则Image的宽高会与Canvas的宽高一致。
Image所在坐标系原点在Canvas中的坐标 = (Image.Width / 2 + Left , Image.Height / 2 + Top) 。
屏幕坐标系与Canvas坐标系都是 左下角为原点,向右为X轴正方向,向上为Y轴正方向 。
在屏幕坐标系上有个点P(x, y),我们先把屏幕分辨率的宽高缩放到与Canvas的宽高一致,此时P点的坐标也会随着缩放。
因为屏幕坐标系与Canvas坐标系都是左下角为原点,所以缩放完成后的P的位置(记作P2),就是P点在Canvas坐标系上的位置。
P2 = (P.x * Canvas.Width / Screen.Width, P.y * Canvas.Height / Screen.Height)
现在有一个Image UI,我们先把该Image的锚点设置为左下角( Anchors.Min(0, 0),Anchors.Max(0, 0) ),然后把P2的位置赋值给Image的anchoredPosition,此时该Image刚好就在P点的位置。
在Canvas坐标系上有一个Image UI,我们先把该Image的锚点设置为左下角( Anchors.Min(0, 0),Anchors.Max(0, 0) ),然后把Canvas的宽高缩放到与屏幕分辨率的宽高一致,此时Image的anchoredPosition(记作P)也会随着缩放。
因为屏幕坐标系与Canvas坐标系都是左下角为原点,所以缩放完成后的Image的anchoredPosition(记作P2),就是Image在屏幕坐标系上的位置。
P2 = (P.x * Screen.Width / Canvas.Width, P.y * Screen.Height / Canvas.Height)
6. 如何用unity打开内置编译器
用unity打开内置编译器步骤如下:
1、在Unity这里找到项目列表。
2、点击添加按钮对已安装的编译器进行添加。
3、选择已安装的编译器进行选择。
7. unity 3D 中运行前出现编译错误怎么解决
问题在于编译没有通过。
首先看上去你的资源的版本和你的Unity3D的版本不一样,以至于rigidbody没办法用这种方式访问,建议使用.GetComponent 方法。
然后是你的资源的似乎缺少的Antialiasing,AAMode文件以至于无法访问这个脚本,建议看一眼这两个文件是否还存在。
8. unity怎么使用bitcode编译
的视频(包括透明视频和流媒体)的播放,支持二维码识别。
EasyAR支持PC和移动设备等多个平台,EasyAR不会显示水印,也没有识别次数限制。
在拿到EasyAR package或EasyAR样例之后,你需要一个key才能使用。请确保在使用EasyAR之前阅读以下内容。
这篇文章介绍如何运行EasyAR unity样例。
工具/原料
操作系统:Windows 7、Mac OS X、Android 4.0、iOS 7.0
Android/iOS GLES2、Unity 3D、
方法/步骤
1
打开样例
首先你需要打开unity样例工程并打开样例中的场景。
Unity 4 如下图所示,
2
而Unity 5 如下,
3
使用Unity 5打开工程之后,需要按照Unity的说明升级工程。升级之后就可以正常使用,配置和Unity 4相同。
4
输入Key
找到 ‘EasyAR’ object 并在inspector中输入‘Key’。如果key是非法的,程序初始化将会失败,可能显示黑屏。
5
按照下面的说明在TextArea 中填入Key。
6
就是这么简单!现在就可以在包括Windows/Mac/Android/iOS所有平台上运行Unity 样例了。
XCode 配
9. unity 导出安卓工程怎么编译成apk
1.Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)
2.Unity3D端代码要在Unity中开发
3.Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。
4.将Android端代码编译成jar文件以插件形式放入到Unity端中
5.在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行
本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。
个人理解UnityPlay是个Unity提供给外部交互的一个接口类。
为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。
在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classes.jar的jar文件,它就是我们想要的。
而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。
由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。
/**
* UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity继承自NativeActivity
* 在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。
*/
public class UnityPlayerNativeActivity extends NativeActivity
{
//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;
protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 设置显示窗口参数
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);
// 创建一个UnityPlayer对象,并赋值给全局的引用变量
mUnityPlayer = new UnityPlayer(this);
//为UnityPlayer设置一些参数
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在将view附加到layout之前调用。它将会调用native code
mUnityPlayer.init(glesMode, trueColor8888);
// 从UnityPlayer中获取到Unity的View视图
View playerView = mUnityPlayer.getView();
// 将Unity视图加载到根视图上
setContentView(playerView);
// 使Unity视图获取焦点
playerView.requestFocus();
}
protected void onDestroy ()
{
// 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code
mUnityPlayer.quit();
super.onDestroy();
}
// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
protected void onPause()
{
super.onPause();
mUnityPlayer.pause();
}
protected void onResume()
{
super.onResume();
mUnityPlayer.resume();
}
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
}
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
}
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
}
}