1

我使用构建的程序Unity3D偶尔会冻结,此操作会冻结我的计算机。我无法查明根本原因。我在整个项目中都放置了日志,但游戏无法冻结。

是否有任何Unity3D开发人员以我所描述的方式经历过他们的应用程序偶尔冻结的情况?有没有人有任何想法或建议?

由于 30K 字符限制,以下对象已稍作修改。这是我认为包含缺陷的对象,但我无法识别此缺陷。

public class gamePlayController : MonoBehaviour {
    void Start () { 
        int i = 0;
        int selectedPlayers = PlayerPrefs.GetInt("TotalPlayers");

        foreach( GameObject touchable in GameObject.FindGameObjectsWithTag("Touchable") )
        {   
            touchable.SetActive(false);
            touchable.AddComponent(typeof(PlayerCollisionDispatcher));
            PlayerCollisionDispatcher nextDispatcher = touchable.GetComponent<PlayerCollisionDispatcher>();
            nextDispatcher.currentGameObject = touchable;
            nextDispatcher.gameObject.AddComponent("AudioSource");

            for(i = 0; i < this.m_Players.Count; i++)
            {
                if(string.Compare(touchable.name, this.m_Players[i].name) < 0)
                {
                    break;
                }
            }

            if(i < this.m_Players.Count)
            {
                this.m_Players.Insert(i, touchable);
            }
            else
            {
                this.m_Players.Add(touchable);
            }
        }

        while(this.m_Players.Count > selectedPlayers)
        {
            this.m_Players.RemoveRange(selectedPlayers, this.m_Players.Count - selectedPlayers);
        }   

        this.restartGame();
    }

    void OnGameTimer(object sender, ElapsedEventArgs e)
    {
    }

    void Update() {
        Vector3 vector = m_ArialCamera.camera.transform.position;

        vector.x = Mathf.Abs((1500 * this.m_ArialView.x) - 1500) + 250;
            vector.y = (600 * this.m_ArialView.y) + 100;
            vector.z = (1500 * this.m_ArialView.z) + 250;
            m_ArialCamera.camera.transform.position = vector;

        if(this.m_IsGameOver)
        {
            Application.LoadLevel("Replay Screen");
        }
        else if(this.m_SimulateCamera)
        {
            this.SimulateCamera();
        }
        else if(m_AutoPluck)
        {
            this.AutoPluck();
        }
        else if(Time.timeScale != 0.0f && this.m_Dispatcher && this.m_Dispatcher.didObjectStop)
        {
            this.determineTurnOutcome();                                
        }
        else if(Time.timeScale != 0.0f && this.m_Dispatcher && this.m_Dispatcher.didObjectMove)
        {
            this.m_Dispatcher.trackMovementProgress();
        }
        else if(Time.timeScale != 0.0f && this.m_Dispatcher 
            && this.m_Players[this.m_PlayerIndex].rigidbody.velocity.magnitude > 15.0f 
            && this.m_Dispatcher.didPluck)
        {
            this.m_Dispatcher.didObjectMove = true;
        }
    }

    void restartGame()
    {
        this.m_PlayerIndex = -1;
        foreach( GameObject touchable in this.m_Players)
        {
            GameObject startField = GameObject.FindWithTag ("StartField");      
                    touchable.SetActive(false);
            touchable.rigidbody.useGravity = false;
            touchable.rigidbody.velocity = Vector3.zero;
            touchable.rigidbody.AddForce(Vector3.zero);
            touchable.rigidbody.AddTorque(Vector3.zero);

            if(startField)
            {
                Vector3 nextPoint = startField.renderer.bounds.center;
                nextPoint.y = 11.0f;
                touchable.transform.position = nextPoint;
            }

            touchable.rigidbody.useGravity = true;
        }
        this.startNextPlayer();
    }

    void startNextPlayer()
    {
        bool isActivePlayerReady = true;        

        do{
            if(this.m_PlayerIndex != -1)
            {
                audioPlayer.PlayAudio("Audio/Next Player");
            }

            this.m_PlayerIndex = (this.m_PlayerIndex + 1)%this.m_Players.Count;
            this.m_Dispatcher = this.m_Players[this.m_PlayerIndex].GetComponent<PlayerCollisionDispatcher>();
            if(this.m_Dispatcher && !this.m_Dispatcher.isGameOver && !this.m_Dispatcher.didEnterMud)
            {
                if(!this.m_Players[this.m_PlayerIndex].activeSelf)
                {
                    this.m_Dispatcher.startGame();
                    this.m_Players[this.m_PlayerIndex].SetActive(true);
                }

                this.m_Dispatcher.startTurn();
            }
        }
        while(!isActivePlayerReady);

        Vector3 vector = this.m_Players[this.m_PlayerIndex].transform.position;             
        vector.x = (1500 * this.m_ArialView.x) + 250;
        vector.y = 300;
            vector.z = (1500 * this.m_ArialView.z) + 250;
        m_ArialCamera.camera.transform.position = vector;

        this.setAnnouncement("Player " + this.m_Players[this.m_PlayerIndex].name + "'s Turn");

        if(this.m_PlayerIndex != 0)
        {
            this.m_IsSimulating = PlayerPrefs.GetInt("SimulatePlayer" + this.m_Players[this.m_PlayerIndex].name);
            this.m_IsSimulating = 1;
        }
        else
        {
            this.m_IsSimulating = 0;
        }   

        GameObject mainCamera = GameObject.FindWithTag ("MainCamera");              
        MouseOrbit mo = null;   
        if(mainCamera)
        {
            mo = mainCamera.GetComponent<MouseOrbit>();
        }   

        if(this.m_IsSimulating >= 1)
        {           
            this.StartSimulation();

            if(mo)
            {
                mo.DoFreeze = true;
            }                   
        }
        else
        {
            if(mo)
            {
                mo.DoFreeze = false;
            }
        }       
    }

    void StartSimulation()
    {
        System.Random random = new System.Random();
        StringBuilder sb = new StringBuilder();
        int randomNumber = 0;

        //determine either the player object or the next block
        if(this.m_Dispatcher.isKiller)
        {
            m_SimulateToObject = this.m_Players[randomNumber%this.m_Players.Count];                 
            randomNumber = random.Next(0, 100);
        }
        else
        {
            sb.AppendFormat("{0:D2}", this.m_Dispatcher.targetScore);
            Debug.Log("target score=" + sb.ToString());

            foreach(GameObject scoreField in GameObject.FindGameObjectsWithTag("ScoreField"))
            {
                if(scoreField.name == sb.ToString())
                {
                    m_SimulateToObject = scoreField;
                    break;
                }
            }
        }

        this.m_IsTargetInitiallyVisible = false;                
        this.m_SimulationTimer = new System.Timers.Timer();
        this.m_SimulationTimer.Elapsed+=new ElapsedEventHandler(TriggerCameraSimulation);
        this.m_SimulationTimer.Interval=2500;
        this.m_SimulationTimer.Enabled=true;
    }

    void TriggerCameraSimulation(object sender, ElapsedEventArgs e)
    {
        this.m_SimulationTimer.Enabled = false;
        this.m_SimulationTimer.Dispose();
        this.m_SimulateCamera = true;
    }

    void SimulateCamera()
    {
        GameObject mainCamera = GameObject.FindWithTag ("MainCamera");              
        MouseOrbit mo = null;   
        this.m_SimulationTimer.Enabled = false;
        this.m_SimulationTimer.Dispose();

        if(mainCamera)
        {
            mo = mainCamera.GetComponent<MouseOrbit>();

            if(!this.m_IsTargetInitiallyVisible)
            {
                mo.IsManualMove = true;
                mainCamera.transform.position = this.m_Players[this.m_PlayerIndex].transform.position;
                mainCamera.transform.LookAt(this.m_SimulateToObject.transform, Vector3.up);
                this.m_IsTargetInitiallyVisible = true; 
            }
            else if(this.m_SimulateCamera)
            {
                if(mo.getDistance() >= 10.0f)
                {
                    this.m_SimulateCamera = false;
                }
                mo.setDistance(-0.001f);
            }
        }

        if(!this.m_SimulateCamera)
        {               
                this.m_SimulationTimer = new System.Timers.Timer();
            this.m_SimulationTimer.Elapsed+=new ElapsedEventHandler(TriggerSimulatedPluck);
            this.m_SimulationTimer.Interval=2000;
            this.m_SimulationTimer.Enabled=true;
        }
    }

    void TriggerSimulatedPluck(object sender, ElapsedEventArgs e)
    {
        this.m_SimulationTimer.Enabled = false;
        this.m_SimulationTimer.Dispose();
        this.m_AutoPluck = true;
    }

    void AutoPluck()
    {
        System.Random random = new System.Random();
        GameObject mainCamera = GameObject.FindWithTag ("MainCamera");              
        MouseOrbit mo = null;   
        float applyForce = 0.0f;
        float slope = 0.00028648399272739457f;
        float y_int = 0.2908366193449838f;
        Vector3 vTorque = Vector3.zero;
        int simulateId = PlayerPrefs.GetInt("SimulatePlayer" + this.m_Players[this.m_PlayerIndex].name);
        int seed = (5 * ((int)(SimulationOptions.Pro) - simulateId));
        int xSeed = 0;
        int ySeed = 0;
        int zSeed = 0;
        int sign = random.Next(1, 1000)%2;
        int range = random.Next(1, 1000)%seed;
        int myValue = 0;

        this.m_SimulationTimer.Enabled = false;
        this.m_SimulationTimer.Dispose();

        if(mainCamera)
        {
            mo = mainCamera.GetComponent<MouseOrbit>();
            mo.IsManualMove = false;
        }

        this.m_AutoPluck = false;

        if(simulateId >= 1)
        {
            float distance = Vector3.Distance(this.m_Players[this.m_PlayerIndex].transform.position,
                this.m_SimulateToObject.transform.position);

            if(simulateId != (int)(SimulationOptions.Pro))
            {
                myValue = random.Next(1, 6);
                seed = (int)(myValue * ((int)(SimulationOptions.Pro) - simulateId));
                sign = random.Next(1, 2);
                range = random.Next(1, seed);

                if(random.Next(1, 1000)%3 == 0)
                {
                    distance += (sign == 1 ? range : -range);
                }
            }

            vTorque.x = (float)(random.Next(1, 90));
            vTorque.y = (float)(random.Next(1, 90));
            vTorque.z = (float)(random.Next(1, 90));

            applyForce = (slope * distance) + y_int;
            this.m_Dispatcher.pluckObject(applyForce, vTorque);
        }
    }

    void determineTurnOutcome()
    {
        int number = -1;
        bool canActivePlayerContinue = false;
        bool isAutoReward = false;
        bool didElinimatePlayer = false;

        foreach(GameObject nextObject in this.m_Players)
        {
            PlayerCollisionDispatcher nextDispatcher = nextObject.GetComponent<PlayerCollisionDispatcher>();

            if(nextObject.activeSelf && !nextDispatcher.isGameOver && !nextDispatcher.isActive)
            {
                if(nextDispatcher.currentScore == nextDispatcher.targetScore)
                {
                    nextDispatcher.totalScore = nextDispatcher.targetScore;
                    int.TryParse(nextDispatcher.name, out number);
                    nextDispatcher.targetScore++;

                    if(nextDispatcher.totalScore >= 13 || nextDispatcher.targetScore > 13)
                    {
                        nextDispatcher.totalScore = 13;
                        nextDispatcher.targetScore = 13;
                        nextDispatcher.isKiller = true;
                        this.setMaterial(nextDispatcher.renderer, "killers", nextDispatcher.name);
                    }
                    else
                    {
                        this.setMaterial(nextDispatcher.renderer, "numbers", nextDispatcher.name);
                    }
                }
                else if(nextDispatcher.didKillerCollide && (nextDispatcher.didLeaveBoard || nextDispatcher.didLeaveBounds))
                {
                    this.setMaterial(nextDispatcher.renderer, "eliminated", nextDispatcher.name);
                    nextDispatcher.isGameOver = true;
                    didElinimatePlayer = true;
                }
                else if(nextDispatcher.didPlayerCollide && (nextDispatcher.didLeaveBoard || nextDispatcher.didLeaveBounds))
                {
                    if(int.TryParse(nextDispatcher.name, out number))
                    {
                        nextDispatcher.targetScore = 1;
                        nextDispatcher.totalScore = 0;
                    }
                }
                else if(nextDispatcher.didEnterMud)
                {
                    this.setMaterial(nextDispatcher.renderer, "mudd", nextDispatcher.name);
                    nextDispatcher.isKiller = false;
                }
                else if(nextDispatcher.isInMud && !nextDispatcher.didEnterMud)
                {
                    isAutoReward = true;
                }
                else
                {
                    this.setMaterial(nextDispatcher.renderer, "numbers", nextDispatcher.name);
                }
            }

            nextDispatcher.transferStates();
        }

        if(this.m_Dispatcher.isKiller && !didElinimatePlayer)
        {
            this.setMaterial(this.m_Dispatcher.renderer, "numbers", this.m_Dispatcher.name);
            this.m_Dispatcher.totalScore = 0;
            this.m_Dispatcher.targetScore = 1;
            this.m_Dispatcher.isKiller = false;
        }
        else if(this.m_Dispatcher.didEnterMud)
        {
            this.setMaterial(this.m_Dispatcher.renderer, "mud", this.m_Dispatcher.name);
        }

        else if(this.m_Dispatcher.currentScore == this.m_Dispatcher.targetScore || isAutoReward)
        {
            this.m_Dispatcher.totalScore = this.m_Dispatcher.targetScore;
            canActivePlayerContinue = true;
            this.m_Dispatcher.consecutivePops++;
            int.TryParse(this.m_Dispatcher.name, out number);
            this.m_Dispatcher.targetScore++;
            this.setMaterial(this.m_Dispatcher.renderer, "numbers", this.m_Dispatcher.name);
        }
        else
        {
            this.setMaterial(this.m_Dispatcher.renderer, "numbers", this.m_Dispatcher.name);
        }

        this.isWinnerAnnounced();

        if(!this.m_IsGameOver && !canActivePlayerContinue)
        {
            this.m_Dispatcher.endTurn();
            this.startNextPlayer();
        }
        else if(canActivePlayerContinue)
        {
            this.m_Dispatcher.transferStates();
            this.m_Dispatcher.isActive = true;
            this.m_Dispatcher.didObjectMove = false;
            this.m_Dispatcher.didObjectStop = false;

            if(this.m_IsSimulating >= 1)
            {           
                this.StartSimulation();
            }
        }

        this.m_ForceValue = 0.0f;   
    }

    void isWinnerAnnounced()
    {
        StringBuilder sb = new StringBuilder();
        int totalPlayers = 0;
        string winner = string.Empty;
        int number = -1;
        int totalPlayersInMud = 0;

        foreach(GameObject nextObject in this.m_Players)
        {
            PlayerCollisionDispatcher nextDispatcher = nextObject.GetComponent<PlayerCollisionDispatcher>();

            if(!nextDispatcher.isGameOver)
            {
                totalPlayers++;
                winner = nextObject.name;
            }
            if(nextDispatcher.isInMud)
            {
                totalPlayersInMud++;
            }
        }

        if(totalPlayers == 1)
        {
            if(winner != string.Empty && int.TryParse(winner, out number))
            {
                sb.AppendFormat("Congratulations Player {0}", number);
                PlayerPrefs.SetString("WinningPlayer", sb.ToString());
            }
            else
            {
                PlayerPrefs.SetString("WinningPlayer", "Congratulations");
            }
            this.m_IsGameOver = true;
        }
        else if(totalPlayersInMud == this.m_Players.Count)
        {
            PlayerPrefs.SetString("WinningPlayer", "All players are stuck in the mud!");
            this.m_IsGameOver = true;
        }
    }

    void setMaterial(Renderer renderer, string state, string playerId)
    {
        StringBuilder sbNextImage = new StringBuilder();

        sbNextImage.AppendFormat("Materials/playerObjects/{0}/{1}", state, playerId);

        Material newMat = Resources.Load(sbNextImage.ToString(), typeof(Material)) as Material;
        if(newMat)
        {
            renderer.material = newMat;
        }
        else
        {
            Debug.Log("FAILED to set material: " + sbNextImage.ToString());
        }
    }

    void setAnnouncement(string text)
    {
        this.m_IsAnnouncement = true;
        this.m_AnnouncementHeight = (int)(Screen.height * 0.5);
        this.m_AnnouncementText = text;
    }

    void OnGUI() {
        GUIStyle labelStyle = GUI.skin.label;
        int number = -1;
        StringBuilder scoreDetails = new StringBuilder();
        StringBuilder turnDetails = new StringBuilder();
        float x = 0;
        float y = 0;
        float w = 64.0f;
        float h = 32.0f;
        float alpha = 1.0f;

        if(this.m_IsAnnouncement)
        {
            this.displayAnnouncement();
        }

        labelStyle.normal.textColor = new Color(1.0f, 1.0f, 1.0f, alpha);

        Texture2D texture = new Texture2D(32, 32, TextureFormat.ARGB32, false);

        for(int i = 0; i < 32; i++)
        {
            for(int j = 0; j < 32; j++)
            {
                texture.SetPixel(i, j, new Color(0.0f, 0.0f, 0.0f, 0.25f));
            }
        }

        texture.Apply();
        labelStyle.normal.background = texture;

        if(this.m_DoShowScore)
        {
            foreach(GameObject nextObject in this.m_Players)
            {
                PlayerCollisionDispatcher nextDispatcher = nextObject.GetComponent<PlayerCollisionDispatcher>();

                int.TryParse(nextDispatcher.name, out number);

                if(nextDispatcher.isGameOver)
                {
                    scoreDetails.AppendFormat("\tPlayer {0}: Game Over\n", number);
                }
                else if(nextDispatcher.didEnterMud)
                {
                    scoreDetails.AppendFormat("\tPlayer {0}: In The Mudd\n", number);
                }
                else if(nextDispatcher.isKiller)
                {
                    scoreDetails.AppendFormat("\tPlayer {0}: Killer\n", number);
                }
                else
                {
                    scoreDetails.AppendFormat("\tPlayer {0}: {1}\n", number, nextDispatcher.totalScore);
                }
            }                   

            GUI.Label (new Rect (0, 0, 225, 100), scoreDetails.ToString());
        }

        w = 64.0f;
        h = 32.0f;
        x = Screen.width - w;
        y = Screen.height - h;
        if(GUI.Button (new Rect (x, y, w, h), "Menu"))
        {
            audioPlayer.PlayAudio("Audio/Click");
            this.m_IsMenuShowing = !this.m_IsMenuShowing;
        }

        if(this.m_IsMenuShowing)
        {
                w = (64.0f * this.m_MenuText.Length);
            h = 32.0f;
            x = Screen.width - w - 64.0f;
            y = Screen.height - h;
            int selOption = GUI.Toolbar(new Rect(x, y, w, h), this.m_MenuOption, this.m_MenuText);

            if(selOption != this.m_MenuOption)
            {
                audioPlayer.PlayAudio("Audio/Click");
                this.m_MenuOption = -1;
                this.m_IsMenuShowing = !this.m_IsMenuShowing;
                switch(selOption)
                {                           
                case (int)(MenuOptions.ArialViewOption):    //arial
                    this.m_ArialCamera.SetActive(!this.m_ArialCamera.activeSelf);
                    break;
                case (int)(MenuOptions.VolumeOption):   //mute
                    int muteVolume = PlayerPrefs.GetInt("MuteVolume");
                    muteVolume = (muteVolume + 1)%2;
                    PlayerPrefs.SetInt("MuteVolume", muteVolume);
                    if(muteVolume == 0)
                    {
                        this.m_MenuText[(int)(MenuOptions.VolumeOption)] = "Mute";
                    }
                    else
                    {
                        this.m_MenuText[(int)(MenuOptions.VolumeOption)] = "Volume";
                    }
                    break;
                case (int)(MenuOptions.PauseOption):    //pause
                    if(Time.timeScale == 0.0f)
                    {
                        this.setAnnouncement("Continuing Game Play");
                        Time.timeScale = this.m_Speed;
                        this.m_MenuText[(int)(MenuOptions.PauseOption)] = "Pause";
                    }
                    else
                    {
                        this.setAnnouncement("Game Is Paused");
                        Time.timeScale = 0.0f;
                        this.m_MenuText[(int)(MenuOptions.PauseOption)] = "Play";
                    }
                    break;
                case (int)(MenuOptions.ScoresOption):   //scores
                    this.m_DoShowScore = !this.m_DoShowScore;
                    break;
                case (int)(MenuOptions.RestartOption):  //restart
                    Time.timeScale = this.m_Speed;
                    this.restartGame();
                    break;
                case (int)(MenuOptions.QuitOption): //quit
                    Application.LoadLevel("Opening Screen");
                    break;
                default:
                    break;
                }
            }
        }

        if(this.m_ArialCamera.activeSelf)
        {
            x = Screen.width * 0.7f - 10.0f;
            y = 0;
            w = 10.0f;
            h = Screen.height * 0.3f;
            this.m_ArialView.z = GUI.VerticalSlider (new Rect(x, y, w, h), this.m_ArialView.z, 1.0f, 0.0f);

            x = Screen.width * 0.7f;
            y = Screen.height * 0.3f;
            w = Screen.width * 0.3f;
            h = 10.0f;
            this.m_ArialView.x = GUI.HorizontalSlider (new Rect(x, y, w, h), this.m_ArialView.x, 1.0f, 0.0f);

            x = Screen.width * 0.7f;
            y = Screen.height * 0.3f + 12.0f;
            w = Screen.width * 0.3f;
            h = 10.0f;
            this.m_ArialView.y = GUI.HorizontalSlider (new Rect(x, y, w, h), this.m_ArialView.y, 1.0f, 0.0f);
        }

        int.TryParse(this.m_Players[this.m_PlayerIndex].name, out number);

        turnDetails.AppendFormat("\tPlayer {0}'s Turn\n", number); 
        turnDetails.AppendFormat("\tNext Goal: {0}\n", this.m_Dispatcher.targetScore); 

        GUI.Label (new Rect (0, Screen.height - 100, 225, 100), turnDetails.ToString());

        if(!this.m_Dispatcher.didObjectMove && m_IsSimulating == 0)
        {
            x = 250.0f;
            y = Screen.height - 190.0f;
            w = 30.0f;
            h = 150.0f;
            this.m_ForceValue = GUI.VerticalSlider (new Rect(x, y, w, h), m_ForceValue, 1.0f, 0.0f);

            x = 250.0f;
            y = Screen.height - 30.0f;
            w = 100.0f;
            h = 30.0f;
            if(GUI.Button (new Rect(x, y, w, h), "Pluck!")) 
            {
                System.Random random = new System.Random();
                Vector3 vTorque = Vector3.zero;
                int xSeed = 0;
                int ySeed = 0;
                int zSeed = 0;

                xSeed = (random.Next(1, 45));
                ySeed = (random.Next(1, 45));
                zSeed = (random.Next(1, 45));

                vTorque = new Vector3(xSeed, ySeed, zSeed);
                this.m_Dispatcher.pluckObject(this.m_ForceValue, vTorque);
            }
        }   
    }   

    void displayAnnouncement()
    {
        float x = 0;
        float y = 0;
        float w = 0;
        float h = 0;
        float alpha = 1.0f;     
        GUIStyle announcementStyle = null;
        GUIStyle labelStyle = null;

        announcementStyle = new GUIStyle();
        labelStyle = GUI.skin.label;
        labelStyle.normal.textColor = new Color(1.0f, 1.0f, 1.0f, alpha);

        x = (int)(Screen.width * 0.25);
        y = (int)m_AnnouncementHeight;
        w = (int)(Screen.width * 0.5);
        h = 100;
        alpha = (float)m_AnnouncementHeight/(float)(Screen.height * 0.5);
        announcementStyle.fontSize = 32;
        announcementStyle.alignment = TextAnchor.MiddleCenter;
        announcementStyle.fontStyle = FontStyle.BoldAndItalic;
        announcementStyle.normal.textColor = new Color(1.0f, 1.0f, 1.0f, alpha);                

        GUI.Label (new Rect (x, y, w, h), this.m_AnnouncementText, announcementStyle);

        if(Time.timeScale != 0.0f)
        {
            if((this.m_AnnouncementHeight + h) <= 0)
            {
                this.m_IsAnnouncement = false;
                this.m_AnnouncementHeight = (int)(Screen.height * 0.5);
            }
            else
            {
                this.m_AnnouncementHeight -= 1;
            }
        }
    }
}

-----------
4

2 回答 2

0

我相信我已经缩小了冻结范围。模拟测试结果让我相信我的问题出在 OnGUI() 方法中。我已经把这个方法全部注释掉了,我的应用程序运行顺利。我会弄清楚这一点,除非有人在根本原因和解决方案上击败我。

于 2013-03-27T13:14:07.130 回答
0

我解决了...

我最初的怀疑是正确的:问题确实出在 OnGUI() 方法中。我将以下源代码移至 Start() 方法。这是有道理的,因为我只构建了一次透明背景纹理。:

Texture2D texture = new Texture2D(32, 32, TextureFormat.ARGB32, false);

for(int i = 0; i < 32; i++)
{
    for(int j = 0; j < 32; j++)
    {
        texture.SetPixel(i, j, new Color(0.0f, 0.0f, 0.0f, 0.25f));
    }
}

texture.Apply();
于 2013-03-29T17:04:55.517 回答