Unity知識四:Unity編程過程中遇到的小問題(持續更新)

**

問題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' toUnityEngine.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日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章