冗余拍摄代码

时间:2016-05-29 03:23:21

标签: c# unity3d

摘要:我想知道我的代码是否是不必要的冗余。我注意到,在查看我的代码时,我有一个不必要的变量和if语句。两个Fire()方法都可以无错误地实现所需的结果(从我所看到的)。对我来说,Redundant Fire Method读取的分配更好,是我更喜欢的方法,但我只是想知道替代火力方法是否仍然值得在效率方面取得可读性。我也想知道在我不知道的任何一种方法中是否可能出现任何潜在的错误。

修改 Unity版本4.6.3

当按下空格键时,

火焰方法结果 - 产生一个激光,它以预设的速度向敌人射击,并被重新加载时间延迟。

按下空格键时,

所需结果 - 产生一个激光,并以预设速度朝向敌人向上射击,并且延迟等于预设的重载时间。

变量:

public float reloadTime = 0.2f;
public GameObject playerProjectilePrefab;
public float playerProjectileSpeed = 10f;

private bool canShoot = true;
private float reloadCountDown;

冗余火灾方法:

void Fire (){
    Vector3 startPosition = transform.position + new Vector3(0 ,(renderer.bounds.size.y * 0.5f), 0);

    if (canShoot && Input.GetKey(KeyCode.Space)){
        canShoot = false;
        GameObject playerProjectile = Instantiate(playerProjectilePrefab, startPosition, Quaternion.identity) as GameObject;
        playerProjectile.rigidbody2D.velocity = new Vector3 (0, playerProjectileSpeed, 0);
        reloadCountDown = reloadTime;
    } else if (!canShoot){
        reloadCountDown -= Time.deltaTime;
    }
    if (reloadCountDown <= 0f){
        canShoot = true;
    }
}

替代火力法:

void Fire (){
    Vector3 startPosition = transform.position + new Vector3(0 ,(renderer.bounds.size.y * 0.5f), 0);

    if (reloadCountDown <= 0f && Input.GetKey(KeyCode.Space)){
        GameObject playerProjectile = Instantiate(playerProjectilePrefab, startPosition, Quaternion.identity) as GameObject;
        playerProjectile.rigidbody2D.velocity = new Vector3 (0, playerProjectileSpeed, 0);
        reloadCountDown = reloadTime;
    } else if (reloadCountDown > 0f){
        reloadCountDown -= Time.deltaTime;
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

根据你在函数中的代码所做的,第一个代码有点多余,但第二个代码修复它。

由于您提到效率,您仍然可以优化第二个代码。

你的下一个问题是这行代码:

GameObject playerProjectile = Instantiate(playerProjectilePrefab, startPosition, Quaternion.identity) as GameObject;

这样做,每次拍摄时都会分配内存。如果您要实例化对象一次,则应实施对象池。所有这一切都是为了重用已经实例化的GameObject。

您的代码很可能Destroy(gameObject)也很昂贵。如果你不这样做,那就更糟了,因为你正在创建新的对象而不会破坏旧的对象。实施对象池后,您无需再次使用InstantiateDestroy。您只需使用Pooling脚本返回可用的GameObject即可。

Here您可以了解如何在Unity中实现自己的对象池。

其他笔记

升级到Unity 5时,

playerProjectile.rigidbody2D.velocity变为playerProjectile.GetComponent<Rigidbody2D>().velocity

renderer.bounds.size.y变为gameObject.GetComponent<Renderer>().bounds.size.y

由于renderer.boundsgameObject.renderer.bounds相同且您需要高效代码,因此您应该将renderer缓存在Start()函数中。

Renderer cachedRender = null;
void Start()
{
    cachedRender = gameObject.GetComponent<Renderer>();
}

然后在Fire()函数中,您可以使用它:

cachedRender.bounds.size.y * 0.5f