Unity知识四:Unity编程过程中遇到的小问题(持续更新)
Posted 博士装呗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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' 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知识四:Unity编程过程中遇到的小问题(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章