Понедельник, 02 Декабря 2024, 07:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помощь новичкам как и я.
AdomДата: Среда, 24 Июля 2013, 16:22 | Сообщение # 1
Печенька!
Сейчас нет на сайте
Сколько был на разных сайтах всегда встречал вопрос как сделать чтобы враг подошел и стрелял при этом игрок получал урон.Я тоже задавался этим вопросом но ничего не мог найти поэтому я решил сам это сделать.
Вот мое biggrin
Это скрипт врага.

Код
// 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 скрипт не мой я немного просто переделал а другие мои может и коряво но строго не судите.
Если не правильно сразу - и замечания не ставьте все исправлю.Ну а если помог то если не тяжело поставьте + biggrin


Сообщение отредактировал Adom - Четверг, 25 Июля 2013, 15:38
KiraДата: Среда, 24 Июля 2013, 16:32 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Adom, Молодец, а теперь смотри вот что ...
Цитата (Adom)
GetComponentInChildren<Xp2>().HP =0;

Цитата (Adom)
if(GameObject.FindWithTag("Bullet2")){

и подобные вещи, тормозные. Поэтому их нужно кэшировать в старте.
GameObject go =FindWithTag("Bullet2")); go теперь ссылка.

Цитата (Adom)
public class XP : MonoBehaviour {
public Transform Player;
public Transform Bullet;
public float xp =0;
public float Health;
public float CurXP;


Подобные вещи нужно, вынести в отдельный класс.

class Character
{
public Transform Player;
public Transform Bullet;
public float xp;
public float Health;
public float CurXP;
}
ну и стараться делать, код читаемым и модульным. Что бы добавив переменную, не пришлось все переписывать заново.

И да форматирование, и правильное написание имен, очень помогает. Мне даже показалось, что я ослеп и не могу вчитаться в текст.


Unity3d разработчик на С#. Лучшее спасибо + в репу.
"Безумие: делать одно и то же снова и снова, и ждать при этом разных результатов".
"Человек, который никогда не ошибался никогда не пробовал ничего нового".
"Если человек может спокойно управлять автомобилем во время поцелуя красивой девушки, значит он уделяет поцелую недостаточно внимания”. Альберт Эйнштейн
AdomДата: Среда, 24 Июля 2013, 16:36 | Сообщение # 3
Печенька!
Сейчас нет на сайте
Спасибо что подправил скрипт мне это не помешает в учении языка.

Добавлено (24.07.2013, 16:36)
---------------------------------------------
Вот вопрос а вот за это можно ставить -?
не нужно в одном посте говорить что скрипт твой и в тоже время не твой.

Stalker_ShooterДата: Среда, 24 Июля 2013, 16:52 | Сообщение # 4
3D XNA'шник
Сейчас нет на сайте
Adom, минус можно ставить за что угодно, это личное дело пользователя. Не согласен, оспаривай у админов. Но это редко положительно заканчивается.

*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
AdomДата: Среда, 24 Июля 2013, 17:01 | Сообщение # 5
Печенька!
Сейчас нет на сайте
Печаль

Добавлено (24.07.2013, 17:01)
---------------------------------------------
А репутация влияет на ранги типа частный гость и тд ?

Stalker_ShooterДата: Среда, 24 Июля 2013, 17:28 | Сообщение # 6
3D XNA'шник
Сейчас нет на сайте
Цитата (Adom)
А репутация влияет на ранги типа частный гость и тд ?


Нет. На эти ранги влияет только кол-во сообщений, на сколько мне известно.


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
AdomДата: Среда, 24 Июля 2013, 17:33 | Сообщение # 7
Печенька!
Сейчас нет на сайте
Ооо спасибо
allodsДата: Среда, 24 Июля 2013, 23:15 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
В следующий разок засунь свой код в [,code]сюда[,/code] только без запятых как, эт просто чтоб показать а то нефига не понял
seamanДата: Среда, 24 Июля 2013, 23:41 | Сообщение # 9
старожил
Сейчас нет на сайте
Ну да. Не хочу снижать репутацию, но эта простыня кода никому нафиг не нужна. Разобраться в ней без форматирования просто невозможно.
AdomДата: Четверг, 25 Июля 2013, 00:02 | Сообщение # 10
Печенька!
Сейчас нет на сайте
Все исправил простите что принес неудобства. happy
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг