C# Unity kodu nasıl optimize edilir?

aleksmc

Kilopat
Katılım
1 Şubat 2018
Mesajlar
1.893
Makaleler
3
Çözümler
6
C#, Unity kodu.

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TargetScript : MonoBehaviour
{
    Rigidbody TargetRigidBody;
    GameManager gameManager;
    public ParticleSystem particle;

    readonly float minSpeed = 12f;
    readonly float maxSpeed = 16f;
    readonly float Torque = 2f;
    readonly float xRange = 4;
    readonly float ySpawnPosition = -1;

    public int scoreValue;

    void Start()
    {
        GetRigidBodyAndAddForces();
        gameManager = GameObject.Find("Game Manager").GetComponent<GameManager>();
    }

    Vector3 RandomForce()
    {
        return Vector3.up * Random.Range(minSpeed, maxSpeed);
    }

    Vector3 RandomSpawnPosition()
    {
        return new Vector3(Random.Range(-xRange, xRange), ySpawnPosition, 0);
    }

    float RandomTorque()
    {
        return Random.Range(-Torque, Torque);
    }

    void GetRigidBodyAndAddForces()
    {
        TargetRigidBody = GetComponent<Rigidbody>();
        TargetRigidBody.AddForce(RandomForce(), ForceMode.Impulse);
        TargetRigidBody.AddTorque(RandomTorque(), RandomTorque(), RandomTorque(), ForceMode.Impulse);
        transform.position = RandomSpawnPosition();
    }

    private void OnMouseDown()
    {
        if (gameManager.gameOverBool == false)
        {
            Destroy(gameObject);
            gameManager.UpdateScore(scoreValue);
            Instantiate(particle, transform.position, particle.transform.rotation);

        }
        if (gameObject.CompareTag("Bad"))
        {
            gameManager.GameOver();
        }

    }

    private void OnTriggerEnter(Collider other)
    {
        Destroy(gameObject);
        gameManager.UpdateScore(-10);

        if (!gameObject.CompareTag("Bad"))
        {
            gameManager.GameOver();
        }
    }


    private void Update()
    {
        if (gameManager.gameOverBool)
        {
            Destroy(gameObject);
        }
    }
}
 
Optimizasyondan bahsederken maksimum verimlilikten bahsediyorsanız, önce gereksiz değişken kullanımından kurtulup, akabinde fonksiyonları daha mantıklı bir algoritma ile çalıştırabilirsiniz. Oyun kodlarını bilmediğim için direkt şunu yapın demem mümkün olmasa da bu şekilde bir öneride bulunabilirim.
 
Optimizasyondan bahsederken maksimum verimlilikten bahsediyorsanız, önce gereksiz değişken kullanımından kurtulup, akabinde fonksiyonları daha mantıklı bir algoritma ile çalıştırabilirsiniz. Oyun kodlarını bilmediğim için direkt şunu yapın demem mümkün olmasa da bu şekilde bir öneride bulunabilirim.
Bunu mu diyonuz:
private readonly float minSpeed = 12f, maxSpeed = 16f, torque = 2f, xRange = 4, ySpawnPos = -1;
 
Bunu mu diyorsunuz?
C#:
private readonly float minSpeed = 12f, maxSpeed = 16f, torque = 2f, xRange = 4, ySpawnPos = -1;
Aslına bakarsanız hayır, bu şekilde sadece değişkenlerin erişilebilirliğini değiştirmiş oluruz. Biraz daha clean bir koda sahip olabiliriz bu şekilde. Kodunuzu biraz inceledim, zaten üst düzeyde bir değişken kullanımı göremedim. Optimizasyondan kastınız, oyunun sistem içinde kullandığı kaynaklarsa biraz daha oyun motorunun derinlerine inip düzeltmeniz gerekebilir. Çünkü şu anda kodda "anladığım" kadarıyla kaynak tüketecek pek bir durum yok, değişkenlerin güncellenmesi haricinde bir şey göremedim.
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TargetScript : MonoBehaviour
{
public ParticleSystem particle;
public int scoreValue;

private Rigidbody targetRigidBody;
private GameManager gameManager;

private readonly float minSpeed = 12f, maxSpeed = 16f, torque = 2f, xRange = 4, ySpawnPos = -1;

private void Start()
{

RandomForces();
GetStuff();
}

private void GetStuff()
{
gameManager = GameManager.Instance;
targetRigidBody = GetComponent<Rigidbody>();
}

private void RandomForces()
{
targetRigidBody.AddForce(Vector3.up * Random.Range(minSpeed, maxSpeed), ForceMode.Impulse);
targetRigidBody.AddTorque(RandomTorque(), RandomTorque(), RandomTorque(), ForceMode.Impulse);
transform.position = new Vector3(Random.Range(-xRange, xRange), ySpawnPos, 0);
}

private float RandomTorque() => Random.Range(-torque, torque);

private void OnMouseDown()
{
if (!gameManager.gameOverBool)
{
gameManager.UpdateScore(scoreValue);
Instantiate(particle, transform.position, particle.transform.rotation);
Destroy(gameObject);

if (gameObject.CompareTag("Bad"))
gameManager.GameOver();
}
}

private void OnTriggerEnter(Collider other)
{
gameManager.UpdateScore(-10);

if (!gameObject.CompareTag("Bad"))
gameManager.GameOver();

Destroy(gameObject);
}

private void Update()
{
if (gameManager.gameOverBool)
Destroy(gameObject);
}
}


Şöyle bi şey yaptım hocam. Optimizasyon takıntım var da biraz.

Daha prototip aşamasındayız.







Bu da diğer script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }

public List<GameObject> targets;
public TextMeshProUGUI scoreText;
public TextMeshProUGUI gameOverText;
public Button restartButton;

public bool gameOverBool;
readonly float spawnTimer = 2f;

int score;

void Awake() => Instance = this;

void Start()
{
score = 0;
StartCoroutine(SpawnTargets());
UpdateScore(0);
}

IEnumerator SpawnTargets()
{
while (!gameOverBool)
{
yield return new WaitForSeconds(spawnTimer);
Instantiate(targets[Random.Range(0, targets.Count)]);
}
}

public void UpdateScore(int addScore) => scoreText.text = $"Score: {score += addScore}";

public void GameOver()
{
gameOverBool = true;
gameOverText.gameObject.SetActive(true);
restartButton.gameObject.SetActive(true);
}

public void RestartGame() => SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

2 script var şu anlık.
 
Ne kadar faydası olur bilemem ama

C#:
GameObject. Find("Game Manager").GetComponent<GameManager>
Böyle kullanmasan daha iyi olur.

Bunun yerine GameObject'i dışarıdan ekle.
[SerializeField] private GameObject GameManager;
 
Ne kadar faydası olur bilemem ama

C#:
GameObject. Find("Game Manager").GetComponent<GameManager>
Böyle kullanmasan daha iyi olur.

Bunun yerine GameObject'i dışarıdan ekle.
[SerializeField] private GameObject GameManager;
Haklısınız. Öyle alışmışız zamanında. Findlar çok sıkıntı
 

Yeni konular

Geri
Yukarı