您的位置:首页 > 移动开发 > Unity3D

Unity知识四:Unity编程过程中遇到的小问题(持续更新)

2016-06-08 22:48 726 查看
**

问题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日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 编程