**
問題1:類型轉換問題和Random類問題:
**
看着兩行代碼,在IDE中無錯誤出現,但是保存後在Unity中,就會報錯:
Assets/Scripts/Element.cs(16,32): error CS1503: Argument `#1' cannot convert `float' expression to type `string'
說是不能轉換,網上搜了一大堆,原因好像是編譯的問題,編譯原理沒學過,暫時不明白。但是網上說的解決方法是用Convert.ToInt32()方法來轉換,但是在Unity中怎麼也寫不出來這個方法,原因是沒能導入命名空間:
using System;
導入後,這個問題就可以解決了,但是這個時候:
這個Random又報錯了,原因是Random是C#的類,而不是Unity的類,因此需要導入命名空間:
using Random=UnityEngine.Random;
導入之後就不會出錯了。
**
問題2:快速響應點擊事件的方法:
**
比如我們在製作掃雷遊戲的時候,每一個方塊都是可以點擊的,我還記得第一次響應點擊事件的時候用的是射線,感覺好麻煩!後來用button裏面的click,再然後就是用EventtTrigger來響應,現在可以使用Unity爲我們準備的函數方法: OnMouseUpAsButton().
掃雷遊戲中的一個一個方塊我們是新建一個Sprite,然後爲其添加BoxCollider,一定要添加碰撞器,然後寫一個腳本:test.cs
using UnityEngine;
using System.Collections;
public class test:MonoBehaviour{
void OnMouseUpAsButton()
{
//這裏是你的代碼:點擊了這個方塊你要做什麼事情
}
}
然後把這個腳本拖給剛纔新建的Sprite就可以了,運行,點擊一下Sprite,會運行OnMouseUpAsButton()裏面的方法的。
關於Unity自帶的許多方法,以後會慢慢總結的。
——————————————————————————————2016年6月8日
**
問題3:動態加載Resources文件夾下的Sprite時遇到的問題:
**
當觸發某一事件的時候,我想讓某一個Sprite的圖片改變爲另一張圖片,所以用Resources.Load()方法去加載,但是出錯了:
/// <summary>
/// 鼠標進入按鈕
/// </summary>
/// <param name="go">Go.</param>
public void OnMouseEnter(){
GetComponent<SpriteRenderer> ().sprite = Resources.Load("image 3264");
}
報錯信息爲:
Assets/Scripts/StartInterfaceScripts/StartIntferface.cs(51,49): error CS0266: Cannot implicitly convert type UnityEngine.Object' to
UnityEngine.Sprite’. An explicit conversion exists (are you missing a cast?)
沒太明白是什麼意思,大致是類型轉換的問題,類型沒錯啊,加載的圖片是Sprite(2D and UI),沒理由啊。
修改成:
/// <summary>
/// 鼠標進入按鈕
/// </summary>
/// <param name="go">Go.</param>
public void OnMouseEnter(){
GetComponent<SpriteRenderer> ().sprite = (Sprite)Resources.Load("image 3264");
}
Unity編譯完成沒報錯,運行的時候,事件觸發就開始報錯了:
**InvalidCastException: Cannot cast from source type to destination type.
StartIntferface.OnMouseEnter () (at Assets/Scripts/StartInterfaceScripts/StartIntferface.cs:51)
UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32, Int32)**
這個也沒懂是什麼意思,反正就是類型無法轉換。
再修改:
/// <summary>
/// 鼠標進入按鈕
/// </summary>
/// <param name="go">Go.</param>
public void OnMouseEnter(){
GetComponent<SpriteRenderer> ().sprite = Resources.Load("image 3264") as Sprite;
}
這次運行之後,事件觸發直接圖片就不見了。。。發現物體的Sprite直接爲None,是沒找到嗎?可目標就在那兒啊!!
不信邪,再改:
/// <summary>
/// 鼠標進入按鈕
/// </summary>
/// <param name="go">Go.</param>
public void OnMouseEnter(){
Sprite mySprite=Resources.Load("image 3264") as Sprite;
print (mySprite);
GetComponent<SpriteRenderer> ().sprite = mySprite;
}
運行結果。。print出來 Null。
網上的解決方法是:
/// <summary>
/// 鼠標進入按鈕
/// </summary>
/// <param name="go">Go.</param>
public void OnMouseEnter(){
GetComponent<SpriteRenderer> ().sprite = Resources.Load<Sprite> ("image 3264");
}
運行結果正常,我的天。。。
網上的解釋是說在Resources文件夾下有你要加載的資源,同時還有另一個同名的文件,但是這個文件不是我們這裏需要的Sprite,因此,加載到它的時候就會出現各種不正常的情況。。
http://stackoverflow.com/questions/28629874/unity-resources-loadsprite-vs-as-sprite
皇天后土,明月可鑑!同名的文件在哪呢?我找了半天沒找到,給我出來!!!
——————————————————————————————2016年6月14日