Unity - 在游戏电视机中

时间:2015-05-01 10:58:50

标签: unity3d unityscript

我有一些电视机型,比如 alt text

和C#代码

using UnityEngine;
using System.Collections;

public class ClicktoPlayWebMovieClass : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    private Vector3 FindBoundCord (int i, GameObject _GameObject){
        /*This is basically where the code starts. It starts out by creating a 
           * bounding box around the target GameObject. 
          It calculates the 8 coordinates forming the bounding box, and 
          returns them all to the for loop.
          Because there are no real method which returns the coordinates 
          from the bounding box I had to create a switch/case which utillized 
          Bounds.center and Bounds.extents.*/

        Bounds _TargetBounds = _GameObject.GetComponent<Renderer>().bounds;
        Vector3 _TargetCenter = _TargetBounds.center;
        Vector3 _TargetExtents = _TargetBounds.extents;


        switch(i){
        case 0:
            return _TargetCenter + new Vector3(_TargetExtents.x, _TargetExtents.y, _TargetExtents.z); 
        case 1:
            return _TargetCenter + new Vector3(_TargetExtents.x, _TargetExtents.y, _TargetExtents.z*-1);
        case 2:
            return _TargetCenter + new Vector3(_TargetExtents.x, _TargetExtents.y*-1, _TargetExtents.z);
        case 3:
            return _TargetCenter + new Vector3(_TargetExtents.x, _TargetExtents.y*-1, _TargetExtents.z*-1);
        case 4:
            return _TargetCenter + new Vector3(_TargetExtents.x*-1, _TargetExtents.y, _TargetExtents.z);
        case 5:
            return _TargetCenter + new Vector3(_TargetExtents.x*-1, _TargetExtents.y, _TargetExtents.z*-1);
        case 6:
            return _TargetCenter + new Vector3(_TargetExtents.x*-1, _TargetExtents.y*-1, _TargetExtents.z);
        case 7:
            return _TargetCenter + new Vector3(_TargetExtents.x*-1, _TargetExtents.y*-1, _TargetExtents.z*-1);
        default:
            return Vector3.zero;
        }

    }

    IEnumerator MyMethod() {
        //Debug.Log("Before Waiting 2 seconds");
        yield return new WaitForSeconds(2);
        //Debug.Log("After Waiting 2 Seconds");
    }

    public string url = "http://becunningandfulloftricks.files.wordpress.com/2013/04/hedgehog_in_the_fog.ogg";

    // Update is called once per frame
    void Update () {


        if (Input.GetMouseButtonDown (0)) {
            Debug.Log("clicked");
            // Start download
            var www = new WWW(url);
            // Make sure the movie is ready to start before we start playing
            var movieTexture = www.movie;
            while (!movieTexture.isReadyToPlay) {
                StartCoroutine(MyMethod());
            }

            print("LOADED!!!");

            Vector2 _ObjectScreenCord, _Xmin = new Vector2(Screen.width,0), _Xmax = Vector2.zero, _Ymin = new Vector2(Screen.height,0), _Ymax = Vector2.zero;
            float _Height, _Width;    


            for(int i = 0; i != 8; i++){
                //FindBoundCord() locates the eight coordinates that forms the boundries, followed by converting the coordinates to screen space.
                // The entire script starts in FindBoundCord
                _ObjectScreenCord = Camera.main.WorldToScreenPoint(FindBoundCord(i, transform.gameObject));

                /* After gathering the coordinates and converting them to screen space
              we try to locate which of these have the highest/minimum x and y values.
             The difference between highest/minimum x and y must correspond to
              width and height.*/

                if(_ObjectScreenCord.x > _Xmax.x){
                    _Xmax.x = _ObjectScreenCord.x;
                }
                else if(_ObjectScreenCord.x < _Xmin.x){
                    _Xmin.x = _ObjectScreenCord.x;
                }    
                if(_ObjectScreenCord.y > _Ymax.x){
                    _Ymax.x = _ObjectScreenCord.y;
                }
                else if(_ObjectScreenCord.y < _Ymin.x){
                    _Ymin.x = _ObjectScreenCord.y;
                }            
            }



            //Too measure the distance between them, I use the Vector2 method Distance.
            _Height = Vector2.Distance(_Ymax, _Ymin);
            if (_Height > Screen.height || _Height < 0){
                _Height = 0;
            }

            _Width = Vector2.Distance(_Xmax, _Xmin);
            if (_Width > Screen.width || _Width < 0){
                _Width = 0;
            }

            print(_Height+" - "+_Width);


            GetComponent<Renderer>().material.mainTexture = movieTexture;
            // Assign clip to audio source
            // Sync playback with audio
            GetComponent<AudioSource>().clip = movieTexture.audioClip;
            // Play both movie & sound

            GUITexture gt = GetComponent<GUITexture>();
            gt.texture = movieTexture;


            transform.localScale = new Vector3 (0f,0f,0f);
            transform.position = new  Vector3 (0.5f,0.5f,0f);

            Rect r = gt.pixelInset;


            print(_Width);
            print(movieTexture.width / 2);

            r.xMin = -_Width / 2;
            r.xMax = _Width / 2;
            r.yMin = -_Height / 2;
            r.yMax = _Height / 2;

//          r.xMin = -movieTexture.width / 2;
//          r.xMax = movieTexture.width / 2;
//          r.yMin = -movieTexture.height / 2;
//          r.yMax = movieTexture.height / 2;

            gt.pixelInset=r;            
            movieTexture.Play();
            GetComponent<AudioSource>().Play();
        }
    }

}

当我点击我的电视机时,看起来不错: alt text

在我不旋转相机之前看起来不错。相机旋转后,movieTexture在屏幕上有初始位置:

alt text

它让我的电视机坏了...... 如何指定movieTexture,它必须具有GetComponent<Renderer>().material.mainTexture的位置?我需要make看起来像这样

alt text

但是电视的屏幕必须是必须旋转的电影屏幕,就像电视机的屏幕一样......

1 个答案:

答案 0 :(得分:1)

你看过投影仪了吗?他们做得非常好,只需改变你想要的纹理。它们通常用于阴影,但任何纹理都可以投射到任何模型上。 http://docs.unity3d.com/Manual/class-Projector.html