using System.Collections; using System.Collections.Generic; using UnityEngine; public class enemy : MonoBehaviour { public Transform target; float timeTemp; public float speed; public Transform protagonists; public int direction; public int hp; public int kills; public int level; public GameObject bulletPrefab; private kill kill; // Start is called before the first frame update void Start() { kill = GameObject.Find("kill").GetComponent<kill>(); } // Update is called once per frame void Update() { Move(); hpes(); automatic(); } // 控制敌人移动 public void Move() { if (Time.time - timeTemp >= 2) { direction = Random.Range(0, 4); } if (direction == 0) { this.gameObject.transform.Translate(Vector3.up * speed * Time.deltaTime); } else if (direction == 2) { this.gameObject.transform.Translate(Vector3.down * speed * Time.deltaTime); } else if (direction == 3) { this.gameObject.transform.Translate(Vector3.right * speed * Time.deltaTime); } else if (direction == 1) { this.gameObject.transform.Translate(Vector3.left * speed * Time.deltaTime); } } //判断死亡 public void hpes() { if (hp <= 0) { Destroy(this.gameObject); kill.IncreaseKillCount(); } } // 判断是否受伤 public void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "zhi2") { Destroy(collision.gameObject); hp = hp - 1; } } // 靠近自动攻击 public void automatic() { if (Time.time - timeTemp >= 3) { float distance = Vector3.Distance(transform.position, target.position); Debug.Log(distance); if (distance <= 2) { GameObject Player = GameObject.Find("protagonists"); Vector2 clickPosition = Player.transform.position; GameObject ins = Instantiate(bulletPrefab); ins.GetComponent<Blogs>().clickPosition = clickPosition; if (direction == 0) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y + 0.15f); } else if (direction == 2) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y - 0.15f); } else if (direction == 3) { ins.transform.position = new Vector3(this.gameObject.transform.position.x + 0.15f, this.gameObject.transform.position.y); } else if (direction == 1) { ins.transform.position = new Vector3(this.gameObject.transform.position.x - 0.15f, this.gameObject.transform.position.y); } } timeTemp = Time.time; } } }优化代码
时间: 2023-06-18 12:08:58 浏览: 66
以下是对代码的一些优化建议:
1. 在Start()函数中,应该使用GetComponent<>更具体地获取kill组件,而不是使用Find()函数。
2. 在Move()函数中,可以使用Switch语句替代if else语句,使代码更简洁易读。
3. 在automatic()函数中,可以使用transform.position来获取敌人位置,而不必每次都使用this.gameObject.transform.position。
4. 在automatic()函数中,可以使用transform.up来获取敌人的朝向,从而不必使用direction变量。
5. 在automatic()函数中,可以使用Quaternion.LookRotation()函数来旋转子弹的方向,使其始终面向玩家。
6. 在automatic()函数中,应该使用LayerMask来避免碰撞检测误判,而不是使用tag。
7. 可以使用Object Pooling技术来优化子弹的生成和回收,避免频繁地Instantiate和Destroy。
8. 可以使用协程来实现敌人的移动和攻击动画,使其更加平滑自然。
9. 可以使用状态机来管理敌人的行为,使其更加智能和可控。
10. 可以使用设计模式来优化代码结构,如单例模式、工厂模式、观察者模式等。
相关问题
如何修改以下代码使得带有”Enemy“标签的物体被碰撞两次才死亡: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Attack : MonoBehaviour { void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Enemy")) { Destroy(collision.gameObject); } } }
你可以使用一个 int 类型的变量来记录碰撞的次数。每次碰撞时,将变量加 1。当变量的值达到 2 时,就销毁物体。
下面是修改后的代码:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attack : MonoBehaviour
{
private int collisionCount = 0;
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
collisionCount++;
if (collisionCount >= 2)
{
Destroy(collision.gameObject);
}
}
}
}
```
在这个代码中,我们添加了一个名为 collisionCount 的私有整型变量。在每次碰撞时,我们将变量加 1。如果变量的值等于或超过 2,那么我们就销毁物体。
需要注意的是,这个代码只会在第二次碰撞时销毁物体,而不是在第二次碰撞后立即销毁物体。如果你需要在第二次碰撞后立即销毁物体,你可以在变量增加到 2 时添加一个额外的 Destroy() 函数来立即销毁物体。例如:
```csharp
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
collisionCount++;
if (collisionCount == 2)
{
Destroy(collision.gameObject);
}
else if (collisionCount > 2)
{
Destroy(collision.gameObject);
Debug.Log("Enemy destroyed after two collisions!");
}
}
}
```
在这个代码中,我们在变量增加到 2 时立即销毁物体,并在控制台中输出一条调试信息。这样,你就可以知道物体是在第二次碰撞时被销毁的。
使用以下代码以后,发现同一场景里的两个标签均为Enemy的物体A、B,第一个物体A在player碰撞两次以后销毁,但是第二个物体B碰撞一次以后就会消失,如何解决: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Attack : MonoBehaviour { public int MaxCollisionCount; private int collisionCount=0; void OnCollisionEnter2D(Collision2D collision) { Debug.Log(collisionCount); if (collision.gameObject.CompareTag("Enemy")) { collisionCount++; if (collisionCount == MaxCollisionCount) { Destroy(collision.gameObject); Debug.Log(collisionCount); } else if(collisionCount > MaxCollisionCount) { Destroy(collision.gameObject); Debug.Log(collisionCount); } } } }
这个问题可能是由于两个标签为Enemy的物体A和B共用了同一个Attack脚本所导致的。当第一个物体A碰撞两次后,其collisionCount变量已经达到了MaxCollisionCount的值,因此在第三次碰撞时就会执行Destroy(collision.gameObject)语句将物体A销毁。但是由于物体B也共用了同一个Attack脚本,因此其collisionCount变量也会被累加,当碰撞第一次时,collisionCount的值就已经等于了MaxCollisionCount,因此物体B会在第一次碰撞时就被销毁了。
解决这个问题的方法是给每个标签为Enemy的物体都添加一个独立的Attack脚本,这样就可以确保每个物体的collisionCount变量都是独立的,不会相互影响。如果需要共用Attack脚本,可以将MaxCollisionCount变量改为静态变量,这样所有物体共用的都是同一个静态变量,不会相互影响。以下是修改后的代码示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attack : MonoBehaviour
{
public static int MaxCollisionCount;
private int collisionCount = 0;
void OnCollisionEnter2D(Collision2D collision)
{
Debug.Log(collisionCount);
if (collision.gameObject.CompareTag("Enemy"))
{
collisionCount++;
if (collisionCount == MaxCollisionCount)
{
Destroy(collision.gameObject);
Debug.Log(collisionCount);
}
else if (collisionCount > MaxCollisionCount)
{
Destroy(collision.gameObject);
Debug.Log(collisionCount);
}
}
}
}