遊戲製作之路(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