0

我正在尝试为 Unity Pro 编写一个脚本,该脚本使用其上的关键对象在用户身上加载视频纹理。我是各种错误,例如“NullReferenceException:对象引用未设置为对象的实例”,代码如下:

#pragma strict
static var isPlay : boolean = false;

function OnTriggerEnter (other : Collider) {
    if(other.CompareTag("key")) {
        print("Key!\n");
        isPlay = true;
    }
}

var movTexture : MovieTexture;

function Update() {
    if(isPlay) {
        movTexture = Resources.Load("VideoScraping/VidsList/20130324003252.mp4") as MovieTexture;
        renderer.material.mainTexture = movTexture;
        movTexture.Play();
    }
}

是否有另一种形式的转换需要我加载资源?电影加载方式不同吗?我还缺少另一个元素吗?

4

2 回答 2

1

因此,第一个可能的修复方法是,资源路径必须相对于 /Assets/Resources。从Resources.Load():

如果可以找到,则返回路径中的资产,否则返回 null。该路径相对于项目的 Assets 文件夹中的任何 Resources 文件夹,必须省略扩展名。

接下来是多次播放电影纹理的问题。出于您的问题的目的,我将坚持使用您的布尔标志示例(更改 isPlay -> triggerPlay):

if(triggerPlay) {
    movTexture = Resources.Load("VideoScraping/VidsList/20130324003252.mp4") as  MovieTexture;
    renderer.material.mainTexture = movTexture;
    movTexture.Play();
    triggerPlay = false; //Just swap the flag here.
}

这并不理想,因为无论电影纹理是否正在播放,OnTriggerEnter 都会将 'triggerPlay' 设置为 true。在这方面,您可以将电影播放代码直接移动到 OnTriggerEnter 并摆脱标志。或者您可以执行以下操作:

var movTexture : MovieTexture;
function OnTriggerEnter(other:Collider){
    if(other.CompareTag("key")&&!IsPlaying()){
        movTexture = Resources.Load("VideoScraping/VidsList/20130324003252.mp4") as  MovieTexture;
        renderer.material.mainTexture = movTexture;
        movTexture.Play();  
    }
}
function IsPlaying() :boolean {
    if(movTexture==null) return false;
    if(movTexture.isPlaying)return true;
    return false;
}

您也可以使用协程来播放电影,而不是使用标志,但这有点超出了原始问题的范围。

于 2013-03-25T02:05:57.803 回答
0

现在回答这个问题已经很晚了,但我认为你不应该在 Resoruces.Load() 函数中包含文件扩展名。

 movTexture = Resources.Load("VideoScraping/VidsList/20130324003252") as  MovieTexture;
于 2013-10-29T14:22:05.273 回答