游戏制作之路(22)创建移动的敌人
在前面介绍一个角色控制的功能,角色可以走动,也可以跳起来,还可以开火打静止的敌人,不过这样还是不爽,能否创建一些可以移动的敌人呢?本文就来解决这个问题。因此,跟前面一样创建一个胶囊体,然后再创建一个立方体当作鼻子,同样设置它们的父子关系,然后设置胶囊体的位置为(-2.5, 1.5, 18),跟前面同样的方式把鼻子设置为(0, 0.5, 0.5),这样就设置好敌人。如下图:
接着在工程project下面创建一个材料,把它命名为Enemy,如下图:
创建这个材料之后,就可以把材料Enemy拖动场景里的Enemy和ENose了,这时这个敌人就使用这个材料来渲染,不像我们前面的物体,都是采用缺省白色的材料了。这样就可以区分玩家角色和敌人。
敌人创建之后,还有一个问题,敌人怎么样朝着玩家的角色进行行走,这里就涉及向量的计算问题了,我们知道当两个向量进行相减时,就可以计算出来两个向量的点方向。
比如这里a向量减去b向量,就得一个从D指向B的向量,也就是得到任意两个向量的方向关系。因此,敌人朝着玩家角色方向跟踪,就不断地采用玩家的位置向量减去敌人的位置向量,就可以计算出来方向,当敌人向这个方向进行移动,就可以看到敌人跟踪玩家了。因此,搞懂原理之后,就可以来写代码,如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyMovement : MonoBehaviour {
public float speed = 2.0f;
public float turnSpeed = 180.0f;
private CharacterController controller;
private Transform player;
// Use this for initialization
void Start () {
controller = GetComponent<CharacterController>();
player = GameObject.FindWithTag("Player").transform;
}
// Update is called once per frame
void Update () {
Vector3 direction = player.position - transform.position;
direction.y = 0;
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.LookRotation(direction), turnSpeed * Time.deltaTime);
controller.Move(transform.forward * speed * Time.deltaTime);
}
}
这段代码是EnemyMovement,关联到敌人对象上,当然它也是创建了一个CharacterController组件,把碰撞体都要去掉,鼻子的碰撞体也要去掉。在Start函数里,首先获取本组件的角色组件到controller变量里,通过标签找到玩家角色对象,玩家的角色标签记Player得在这里设置,如下图:
这样就可以找到角色对象保存在player变量里。通过下面这行代码:
Vector3 direction = player.position - transform.position;
就可以计算玩家所在的方向向量,然后通过Quaternion.RotateTowards转动敌人的方向,让它的鼻子朝着玩家进行移动。
到这里就可以完成敌人的跟踪功能。
单片机编译器之链接器
https://edu.csdn.net/course/detail/8437
比特币源码入门教程
https://edu.csdn.net/course/detail/6998
深入浅出Matplotlib
https://edu.csdn.net/course/detail/6859
深入浅出Numpy
http://edu.csdn.net/course/detail/6149
Python游戏开发入门
上一篇: Unity截图的几种方式
下一篇: 安装软件