Сколько был на разных сайтах всегда встречал вопрос как сделать чтобы враг подошел и стрелял при этом игрок получал урон.Я тоже задавался этим вопросом но ничего не мог найти поэтому я решил сам это сделать.
Вот мое
Это скрипт врага.
Код
// Make sure there is always a character controller
@script RequireComponent (CharacterController);
// скорость ходьбы и скорость поворота в секунду
var moveSpeed : float = 2;
var turnSpeed : float = 90;
var bullet : Rigidbody;
var spawnPoint : Transform;
var bulletSpeed : float = 20;
private var _controller : CharacterController;
private var _thisTransform : Transform;
private var _playerTransform : Transform;
function Start()
{
// Получаем контроллер
_controller = GetComponent(CharacterController);
// Получаем компонент трансформации объекта, к которому привязан данный компонент
_thisTransform = transform;
// Получаем компонент трансформации игрока
if (_playerTransform == null && GameObject.FindWithTag("Player"))
_playerTransform = GameObject.FindWithTag("Player").transform;
}
function Update()
{
// направление на игрока
var playerDirection : Vector3 = (_playerTransform.position - _thisTransform.position).normalized;
// угол поворота на игрока
var angle : float = Vector3.Angle(_thisTransform.forward, playerDirection);
// максимальный угол поворота на текущем кадре
var maxAngle : float = turnSpeed * Time.deltaTime;
// Вычисляем прямой поворот на игрока
var rot : Quaternion = Quaternion.LookRotation(_playerTransform.position - _thisTransform.position);
// поворачиваем врага на игрока с учетом скорости поворота
if (maxAngle < angle)
{
_thisTransform.rotation = Quaternion.Slerp(_thisTransform.rotation, rot, maxAngle / angle);
}
else
{
_thisTransform.rotation = rot;
}
// если дистанция до игрока больше трех метров
if (Vector3.Distance(_playerTransform.position, _thisTransform.position) > 3.0f)
{
// двигаемся к игроку
_controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime);
}
else // если меньше или равна трем метрам
{
Fire(); // здесь например стреляем в игрока
}
// гравитация
_controller.Move(Vector3.down * 10.0f * Time.deltaTime);
}
function Fire() {
var b = Instantiate(bullet, spawnPoint.position, spawnPoint.rotation);
b.rigidbody.velocity = transform.TransformDirection(0,0,bulletSpeed);
}
А это скрипт жизней Player.
Код
using UnityEngine;
using System.Collections;
public class XP : MonoBehaviour {
public Transform Player;
public Transform Bullet;
public float xp =0;
public float Health;
public float CurXP;
// Use this for initialization
void Start () {
xp = 100;
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(){
if(GameObject.FindWithTag("Bullet")){
xp -=1;
CurXP -=0.5f;
if(xp <0){
Destroy(GameObject.FindWithTag("Player"));
}
}
}
void OnGUI(){
GUI.Label(new Rect(10, Screen.height - 40, 120, 20),"HP:"+CurXP+ "/"+Health);
}
}
А это как убить врага.
Код
using UnityEngine;
using System.Collections;
public class Xp2 : MonoBehaviour {
public Transform Enemy;
public float HP;
// Use this for initialization
void Start () {
HP = 100;
}
// Update is called once per frame
void Update () {
if(HP <0){
HP =0;
if(HP == 0){
GetComponentInChildren<Xp2>().HP =0;
}
}
}
void OnTriggerEnter(){
if(GameObject.FindWithTag("Bullet2")){
HP -=5;
}else{
HP +=0;
}
if(HP == 0){
Destroy(GameObject.FindWithTag("Body"));
}else{
if(HP == 0){
Destroy(gameObject);
}
}
}
}
AI вешать на врага при этом указать тег Enemy.
XP игрока вешать на пустышку и добавить BoxCollider и там поставить галочку IsTrigger.
А XP2 тоже вешать на пустышку и сделать то же самое что и XP игрока но еще надо кинуть XP на самого врага но не ставить галочку IsTrigger
И у игрока указать тег Player.
Надеюсь все ругать не будут это AI скрипт не мой я немного просто переделал а другие мои может и коряво но строго не судите.
Если не правильно сразу - и замечания не ставьте все исправлю.Ну а если помог то если не тяжело поставьте +