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 09:08:58 浏览: 166
以下是对代码的一些优化建议:
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); } } }
这个脚本应该是可以销毁带有 "Enemy" 标签的物体的。但是,有几个潜在的问题可能会导致物体没有被销毁。
首先,你需要确保你的物体上有一个 Collider2D 组件,以便进行碰撞检测。如果你的物体没有 Collider2D 组件,那么 OnCollisionEnter2D() 函数将永远不会被调用,因此物体也不会被销毁。
其次,你需要确保你的物体与敌人物体有足够的接触面积,以便进行碰撞检测。如果你的物体只是轻微地触碰了敌人物体,那么 OnCollisionEnter2D() 函数可能不会被触发。
最后,如果你的敌人物体是通过代码生成的,那么你需要确保它们具有 "Enemy" 标签。你可以在 Unity 的 Inspector 窗口中为物体添加标签,或者使用代码为它们添加标签,例如:
```csharp
gameObject.tag = "Enemy";
```
如果你已经检查了以上所有问题,但是物体仍然没有被销毁,那么你可以在 OnCollisionEnter2D() 函数中添加调试信息,以便查看函数是否被调用了。例如:
```csharp
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
Destroy(collision.gameObject);
Debug.Log("Enemy destroyed!");
}
else
{
Debug.Log("Collision detected with non-enemy object!");
}
}
```
这样,你就可以在控制台中查看是否存在碰撞,并且是否正确地销毁了物体。
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; } } }代码
这是一个用C#编写的Unity游戏脚本,用于控制游戏中的敌人。脚本中包含了敌人的移动、受伤、死亡和自动攻击等功能。
在Start()函数中,通过Find()方法找到游戏中的“kill”对象,并将其组件赋值给kill变量。
在Update()函数中,调用了Move()、hpes()和automatic()函数。
Move()函数控制敌人的移动,根据时间间隔和随机方向来改变敌人的移动方向。
hpes()函数用于判断敌人是否死亡,当敌人的hp小于等于0时,销毁敌人并调用IncreaseKillCount()方法增加玩家的杀敌数。
OnCollisionEnter2D()函数用于判断敌人是否被攻击,当敌人与“zhi2”标签的游戏对象碰撞时,减少敌人的hp值。
automatic()函数用于判断敌人是否靠近玩家并自动攻击,当敌人靠近玩家时,创建一个子弹对象并进行攻击。
注:该代码只是一个脚本,需要在Unity游戏引擎中使用。
阅读全文