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);
}
}