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' 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日

以上是关于Unity知识四:Unity编程过程中遇到的小问题(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d--Space Shooter(官方教程)--学习感想

2D游戏知识点四Unity 2D退出和多人联机

unity webgl内存最多多大

Unity编程Unity中关于四元数的API详解

Unity高级开发面向对象编程知识总结

Unity---遇到的一些坑和小知识