在 Unity 中引入第二个敌人运动
这里的练习演示了敌人额外移动的实现,该移动从屏幕左端角以倾斜角度开始,在到达屏幕近一半时,倾斜到另一个角度以退出窗口。
在进一步讨论之前,请确保敌人和生成管理器(spawn manager)对象处于良好状态,因为需要它们在此处添加此功能。
这是高级伪代码。
- 首先在检查器(inspector)中获取激光预制件(prefab),复制它并给两个空游戏对象作为它们的父对象以同时控制两者。
- 给出正确的名称后,请确保将角度设置为向前旋转 45 度,因为运动将从该角度开始。
Unity
- 使用与敌方激光相同的标签来标记它们,以将自己与玩家激光区分开来,这样它们的内部碰撞就不会摧毁敌人。 (我们只希望玩家敌人影响敌人,这是将相同激光束分类到不同物体的最短配置。)
Unity
- 为他们分配敌人脚本并使这个激光对象成为预制件(prefab)。
- 在敌人脚本中声明一个序列化字段,将新创建的激光射击指定为预制件(prefab)。
[SerializeField]
private GameObject _enemyAngularPrefab;
Unity文章来源:https://www.toymoban.com/news/detail-815584.html
- 让我们以新协程(coroutine)和新方法的形式对敌人脚本进行一些添加,以启用第二个动作。
- 创建一个与当前 z 旋转值交互的协程,并不断将其递减 1 度,直到达到 Y 轴的 0 值。一旦发生,将旋转更改为-45。
IEnumerator ForwardAngleChange()
{
Vector3 newRotationAngles = transform.rotation.eulerAngles;
newRotationAngles.z -= 1;
yield return new WaitForSeconds(0.1f);
transform.rotation = Quaternion.Euler(newRotationAngles);
if (transform.position.y >=0 && transform.position.y <=1)
{
newRotationAngles.z = -45.0f; //Angle Changes here.
transform.rotation = Quaternion.Euler(newRotationAngles);
}
}
- 创建一个新方法,一是启动翻译方法,二是实例化我们之前创建的角度激光。
- 另外,在新方法中使用上面创建的协程(coroutine)。
public void AngularEnemyMovement()
{
transform.Translate(Vector3.down * _speed * Time.deltaTime);
StartCoroutine(ForwardAngleChange());
if (transform.position.y < -5.3f)
{
Destroy(this.gameObject);
}
if (Time.time > _canFire)
{
_fireRate = Random.Range(3.0f, 8.0f);
_canFire = Time.time + _fireRate;
GameObject EnemyLaser = Instantiate(_enemyAngularPrefab, transform.position, Quaternion.identity);
//We are first getting hold of the prefab and then extracting its children.
Laser[] enemyLaserChild = EnemyLaser.GetComponentsInChildren<Laser>();
for (int i = 0; i < enemyLaserChild.Length; i++)
{
enemyLaserChild[i].SetEnemyLaser();
// Laser type classified here in the laser script.
}
}
}
- 现在,这里需要从更新方法中触发两种不同的移动方法,如果不解决,敌人的移动将是两种不同方法的组合,并且速度会增加一倍。
- 为了解决这个问题,首先声明一个可以在 switch 语句中使用的私有 int 变量,然后创建一个可以从生成管理器(spawn manager)调用的公共方法。
private int _enemyType;
public void EnemyType(int value)
{
_enemyType = value;
}
- 在敌人的更新方法中实现一个 switch 语句,在选择时触发(trigger)两个动作。
private void Update()
{
switch (_enemyType)
{
case 0:
EnemyMovement(); // Regular Movement from top to bottom.
break;
case 1:
AngularEnemyMovement(); // Left angular movement.
break;
}
这就是敌人的脚本。下一部分是从生成管理器(spawn manager)调用第二个方法,以按受控的时间间隔循环敌人。
IEnumerator LeftAngularEnemySpawnRoutine()
{
while (_stopSpawn == false)
{
Vector3 location = new Vector3(Random.Range(-11.0f, -6.0f), 7.6f, 0);
GameObject NewEnemy = Instantiate(_enemyPrefab, location, Quaternion.AngleAxis(45,Vector3.forward));
NewEnemy.transform.parent = _enemyContainer.transform;
NewEnemy.GetComponent<Enemy>().EnemyType(1);
yield return new WaitForSeconds(5.0f);
}
}
- 另外,使用 EnemyType( ) 方法在敌人的常规例程中调用常规敌人的移动。
这应该足以让第二乐章完美地发生。
这是最终结果:)
次要运动文章来源地址https://www.toymoban.com/news/detail-815584.html
非常感谢
到了这里,关于在 Unity 中引入第二个敌人运动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!