您好,登錄后才能下訂單哦!
本人在做線上與線下Unity教學中,經常遇到一些常見的疑問,為了更好的快速進行答復,我平時注意收集了一些典型
的錯誤與疑問,且附有個人解答,供大家交流之用。不足之處,請大家指明。
如果后期總結的易錯誤點,量比較大時我會進行分類處理,更加方便大家查詢。
1: Ngui 和 UGUI 用法是一樣的么?現在游戲公司還在用NGUI 還是用Unity內置的UI系統?
答: 如果你是Unity學習者,建議你NGUI/uGUI都學習,因為目前舊項目一般都用NGUI, 現在立項的公司很多考慮用uGUI ,畢竟第1是官方技術且是開源的技術,而是后繼會不斷發展,有潛力。
2: unity3d的 Terrain上無法烘焙樹木的陰影,該如何解決?
答:Detail meshes 本身不參與烘焙過程,但是其會對地形的lightmap進行采樣。所以,需要對原生的lightmap進行修改,添加陰影。
3: uGUI 中 slider和scorllbar這么相似,分別用在那些地方啊?
答:解釋如下: Slider 控件適合做項目中的“音量調節”、“生命數值”顯示等方面,注重數值展示方面。ScrollBar 控件一般不建議單獨使用,屬于“基礎性”控件,適合與其他控件組合成功能更加強大的“復合控件”,例如我在視頻中講解的“ScrollRect”控件。(作為用戶選擇部分)
4: unity做個項目,安裝在手機上運行一會卡死,都不知道從哪里入手找bug,求各位大神幫忙。。。
答:你自己開發一個移動設備上的找Bug的機制: 如下操作: 第1: 使用Application.persistentDataPath 作為保存數據的路徑。 自己寫一個調試類 (例如: Debuger.cs) 第2:把需要在程序中切入的調試代碼,最終寫入txt 文件(或者XML文件) 第3: 在手機死機后,沒有關系。重新進入后,進入自己開發的一個專門顯示txt 或者XML 中內容的頁面,查看程序運行到哪里,最終找到原因。
這種機制原理,適用于所有的移動平臺的調試。
5 this.gameObject.transform.position= new Vector3(1F, 2F, 3F); 老師,gameObject和transform,position都是屬性,他們之間怎么能引用呢,不是應該通過對象和類來引用的嗎?
答:transform 是GameObject 的屬性。 而GameObject是不能直接應用 transform 的,沒有這個靜態屬性。(Unity規定)。 所以我們通過this.gameObject. 。 獲得這個腳本所在對象(返回GameObject).然后再獲取transform。
6: uGUI 中 老師,我怎么拉不動那中心點,總是拉著整個button或text?
答:你拉不動那個中心點,原因是Unity快捷欄中的“Center”在起作用,它保證中線點就一直在控件的中心位置。 所以請把“Center”點擊改為“Pivot”就可以移動控件中心點了。
7: C# 有高內聚低耦合的概念嗎?
答:"高內聚低耦合"是開發中的一個重要設計與開發原則,C#作為國際上最流行的開發語言之一,當然具備。 本質上其實與語言無關,這是一種開發的宗旨、思想。
8: unity5 可以使用visualstudio 開發代碼,哪可以使用Eclipse開發嗎?
答:目前Unity 不支持Eclipse 作為代碼編輯器插件開發項目。
9: 數組定義好長度之后,想要改變長度怎么辦?
答:數組的特點就是,一點定義了長度,就不能更改。如果你要用可變長數組,就學習“Unity編程基礎篇”,里面講解了ArrayList集合。它的長度是可變的集合。其本質內部實現也是用數組,進行多個數組相互倒換實現的。
10: 旋轉的局部坐標系與世界坐標系的區別是什么?
答:局部坐標旋轉是指以父物體為參考,進行旋轉。而世界坐標系以“坐標陀螺”來進行旋轉。類似的情況例如:東、南、西、北、是世界坐標系。而前、后、左、右是局部坐標系
11: uGUI 怎么改變Canvas的屏幕大小?
答:兩種方法:1:可以推進攝像機,如果是2D開發,則把攝像機的Size 設置的更小些。 2:可以使用代碼方式對Canvas 的Scele 做縮放處理。
12: 怎樣保存游戲進度? Save 和 Load功能?
答:保存游戲的進度本質就是數據持久化技術的應用。例如我視頻中說的Unity提供的Playerfab 。可以把當前玩家的位置信息、狀態(分數、血量、**)等保存且持久化即可。如果是復雜的大量數據保存,建議用XML作對象與XML的串行化。具體可以看看我下月發行的《Unity3d/2d 游戲開發零基礎到精通》的,“數據持久化”章節有詳細論述。
13: 請問:我想通過腳本實現自定義換膚,如何實現比較好?如何利用Sprite Pakcer打包?
答:
//動態追加控件 GameObject GoCloneObject = newGameObject("Button"); //添加精靈(外觀處理) Image p_w_picpath= GoCloneObject.AddComponent<Image>(); Button btn =GoCloneObject.AddComponent<Button>(); p_w_picpath.overrideSprite=Resources.Load("Textures/Sprites/Emoticon - Frown", typeof(Sprite))as Sprite;
以上代碼可以實現動態生成控件,且自定義“換膚”。UGUI 中嚴格來說,我們不需要“Sprite Pakcer打包 ”
14: 用vs2013打開創建的C#腳本,調試的時候顯示:無法直接啟動帶有類庫輸出類型的項目,請在此解決方案中添加一個引用庫項目的可執行項目。將這個可執行項目設置為啟動項目!我已經設置了那個啟動項目,但是還是調試錯誤?
答:是這樣的。 VS只是我們寫代碼的工具,提供了類方法提示、方法高亮顯示等功能。但是腳本的運行,還是需要運行Unity的Play 按鈕的。
15: 老師我的VS 是Blend forstudio2013,在unity編輯器設置為VS打開C#腳本時,報錯打開的不是有效的項目,這該怎么辦啊
答:建議使用VS 2013(官方默認的是MonoDevelop)。你說的VS 版本可能不兼容。
16: 老師,我在unity5.0里面,想播放動畫,this.animation.play ();這樣不行~
答:API 有所更改。this.GetComponent<Animation>().Play();更多Unity5.0 內容API更新請首先看我博客:http://liuguozhu.blog.51cto.com/9142031/1631190 。
17: text.rectTransform.rect.Set(0, 0, 417, 2*(j * 52.5f + 300));為什么沒有效果呢?如果要設置text的hright屬性要怎么辦?
答:這樣定義:txt_Obj.rectTransform.sizeDelta = newVector2(200, 200);//改變寬度與高度。
18: 老師,我問一個問題,我在game視圖16:10 Portrait(10:16)的視圖下運行游戲,場景里的物體運動都是正常的但是當我把game視圖切換到free aspect的時候,場景里的運動物體就都有了“殘影”,就像是屏幕沒有刷新一樣,這個是什么問題呢,我的攝像機用的是正交模式就像是屏幕不刷新了,每一幀都停留到了屏幕上?
答:
1: 這種情況,先考慮在你角色的背后,加一個背景貼圖。
2: ngui的圖集打的不能太大。
19: 老師,Unity中“預加載”什么意思,如何實現?
答: “預加載”一般分為兩種情況:
第1種情況: 轉換場景的時候,我們可以使用異步場景加載的技術,來實現。目的是給玩家一個顯示畫面,在系統后臺加載場景數據,等加載完畢,顯示整個場景。代碼舉例如下:
public class ScenesLoading : MonoBehaviour{
public Slider Sli_Progressbar; //調用進度條
private AsyncOperation async; //異步對象
private float curProgress; //當前進度
void Start ()
{
StartCoroutine(loadScene());
}
//異步讀取場景
IEnumerator loadScene()
{
//async =Application.LoadLevelAsync(ConvertNames.SceneNames[GlobalParameterManager.LoadingScenesName]);
async =Application.LoadLevelAsync(ConvertNames.GetInstance().ScenesToName(GlobalParameterManager.LoadingScenesName));
curProgress = async.progress;
yield return async;
}
void Update()
{
if (curProgress <= 1)
{
curProgress += 0.01f;
}
Sli_Progressbar.value =curProgress;
}
}
第2種情況:
在同一場景中實現“預加載”。
如果一個場景非常龐大,勢必要進行優化。優化最簡單的思路可以如下:
1> 遮擋剔除。
2> LOD 層級細節。
3> “層消隱”處理
如果以上步驟還不明顯的話,可以人為的把整個大場景,劃分為幾個部分,當“角色”(主角)要進入一塊“區域”的時候,可以提前3-20秒進行場景的加載,當“角色”離開這片區域時,我們則可以銷毀這片“區域”,以節省計算機或者移動端設備的內容空間。 這就是“預加載”技術。核心代碼如下:
void Start()
{
//啟動加載大型建筑模型
StartCoroutine("LoadBigBuilding");
}
//本場景進入若干秒后,啟動“預加載”大型場景
IEnumerator LoadBigBuilding()
{
yield return newWaitForSeconds(intLoadTime);
GameObjectgoBuilding_A=Resources.Load("Prefabs/Scenes_A") as GameObject;
GameObject goCloneBuildingA =GameObject.Instantiate(goBuilding_A, Vector3.zero, Quaternion.identity) asGameObject;
}
20: 劉老師,There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.控制臺的消息怎么刪除,不出現這個
答: 這個警告信息告訴我們,場景中存在了2個“音頻監聽器”,這是Unity不允許的。 解決方法很簡單,你只需要把其中一個攝像機的監聽給禁止即可。例如下圖:
21:角色控制器能不能觸發OnTriggerEnter等方法?
答:角色控制器(CharacterController)不能應用OnTriggerEnter 等方法,如果需要檢測CC(CharacterController),需要對方通過名稱或者Tag來觸發檢測。如果需要CC給剛體施加“力”,可以用 OnControllerColliderHit() 方法實現。
(關于其他更多的初學者常見Unity疑問與解答,后面還會繼續總結,敬請期待.)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。