Четверг, 28 Марта 2024, 18:39

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вопрос про OnTriggerStay
Вопрос про OnTriggerStay
wing13Дата: Среда, 31 Июля 2013, 02:21 | Сообщение # 1
участник
Сейчас нет на сайте
Привет всем!
Вопрос такой, сделал зомби, он ходит-бродит, теперь хочу сделать что бы он нападал на игрока.
Решил сделать ему поле обзора триггером, триггер у меня бокс-коллайдер висящий перед самим зомби, я написал такой скрипт и повесил на объект триггера, он поидее должен посылать переменные в скрипт, который показывает всякие сообщения, но он ничего не посылает.
Чего-то я не понимаю в общем.

Код
var zflag = false;  

function Start () {

}

function Update () {

//Посылаем переменные
if(zflag == true){PlayerScaner.MessA =16; PlayerScaner.MessT=100;}

}

//Фиксируем игрока рядом с зомби
function OnTriggerStay(other : Collider) {if(other.tag == "Player" && zflag ==false){var zflag = true;}}
function OnTriggerExit(other : Collider) {if(other.tag == "Player"){var zflag = false;}}


Я вконтакте
ЛевшаДата: Среда, 31 Июля 2013, 03:53 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Collider.OnTriggerEnter(Collider)
This message is sent to the trigger collider and the rigidbody (if any) that the trigger collider belongs to, and to the rigidbody (or the collider if there is no rigidbody) that touches the trigger. Note that trigger events are only sent if one of the colliders also has a rigidbody attached.


X.cor.R (Prologue)
AdomДата: Среда, 31 Июля 2013, 10:17 | Сообщение # 3
Печенька!
Сейчас нет на сайте
Эм для своего врага я делал так.
Код
// 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);
}


Сообщение отредактировал Adom - Среда, 31 Июля 2013, 10:17
wing13Дата: Пятница, 02 Августа 2013, 15:22 | Сообщение # 4
участник
Сейчас нет на сайте
Левша добавление ридгидбоди не помогает, да и на плеере он изначально висит.

Adom я хочу, что бы зомби не видел игрока сзади себя и за препятствием, для этого я сделал триггер виде куба перед зомби и проверку есть ли между обнаруженным в тригере игроком и зомби препятствие, но вот как-то не работает триггер.


Я вконтакте
AdomДата: Пятница, 02 Августа 2013, 15:30 | Сообщение # 5
Печенька!
Сейчас нет на сайте
аааа
allodsДата: Пятница, 02 Августа 2013, 15:56 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Может через камеру как, если в камере то зомби видит"на зомби своя камера"
AdomДата: Пятница, 02 Августа 2013, 16:10 | Сообщение # 7
Печенька!
Сейчас нет на сайте
Можно через ReyCast
wing13Дата: Пятница, 02 Августа 2013, 16:30 | Сообщение # 8
участник
Сейчас нет на сайте
allods а как?

Adom попробовал сделать через рей каст, но рейкаст это тонкий луч же, приходится очень так усердно скакать перед зомби, что бы он заметил biggrin
у меня вообще есть идея, но не совсем понимаю как реализовать, в общем смысл в чем... сейчас рейкаст так сделан
if (Physics.Raycast (transform.position, fwd, hit, 20)) {зомби пинает игрока;}
fwd это forward, то есть луч кастится прямо от объекта каждый кадр, надо как-то так сделать, что бы направление каста рандомно менялось в каждом кадре в диапазоне, достаточном что бы покрыть поле зрения монстра.


Я вконтакте

Сообщение отредактировал wing13 - Пятница, 02 Августа 2013, 16:36
robertonoДата: Пятница, 02 Августа 2013, 16:41 | Сообщение # 9
Чокнутый Кот
Сейчас нет на сайте
Я никогда с коллайдерами не работал, но может это на что то намекнёт : сделать куб, сделать его как тригер, сделать невидимым, прикрепить его в зомби, и проверять когда в коллайдере будет гейм обджект с тагом Player тогда начать убивать. Это только догадки, не считайте за серьезный ответ.
IrondustДата: Пятница, 02 Августа 2013, 16:55 | Сообщение # 10
участник
Сейчас нет на сайте
Специально для этого есть функция
Physics.OverlapSphere
Возвращает массив соллайдеров.
Потом через цикл перебираете массив, и если один из коллайдеров принадлежит игроку, то запускаете атаку
wing13Дата: Пятница, 02 Августа 2013, 17:31 | Сообщение # 11
участник
Сейчас нет на сайте
В общем повесил рейкаст тупо на голову, у зомби есть анимация, где он много вертит головой, результат вроде ок.

Irondust про функцию не знал, попользую.


Я вконтакте
Fr0sTДата: Пятница, 02 Августа 2013, 20:20 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
wing13, а ты используй vector3.distance,смотришь дистанцию от игрока до зомби и если она меньше 5 например метров,то зомби на врага поворачиваешь и талкаешь вперед,а если меньше метра то атакуешь(ну типо зомби атакует).Я вот так делаю.





Сообщение отредактировал Fr0sT - Пятница, 02 Августа 2013, 20:22
AdomДата: Пятница, 02 Августа 2013, 20:28 | Сообщение # 13
Печенька!
Сейчас нет на сайте
Я ему тоже самое предлогал но я не объяснил это )))
robertonoДата: Пятница, 02 Августа 2013, 21:17 | Сообщение # 14
Чокнутый Кот
Сейчас нет на сайте
Fr0sT, мне кажется он хочет что бы зомби нападал если видит его а не что бы он со спины его тоже видел. А так он будет нападать как будто у него глаза на спине.
AdomДата: Пятница, 02 Августа 2013, 21:26 | Сообщение # 15
Печенька!
Сейчас нет на сайте
robertono,))

Добавлено (02.08.2013, 21:26)
---------------------------------------------
robertono,Помоги плиииз
Как переделать эти скрипты для игры по мультиплееру ?
Вот скрипты.

Код
using UnityEngine;
using System.Collections;

public class ControllerD : MonoBehaviour {
public Transform Player;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.W)){
Player.Translate(0,0,1 *1);
}
//
if(Input.GetKey(KeyCode.S)){
Player.Translate(0,0,-1 *1);
}
//
if(Input.GetKey(KeyCode.D)){
Player.Translate(1,0,0 *1);
}
//
if(Input.GetKey(KeyCode.A)){
Player.Translate(-1,0,0 *1);
}
if(Input.GetKey(KeyCode.Space)){
Player.Translate(0,1,0 *1);
}
}
}

И вот этот
Код
using UnityEngine;
using System.Collections;
public class Shooting : MonoBehaviour {
public Transform bullet; //Префаб патрона
public Transform MuzzleFlash; //публичная переменная для префаба вспышки
public int BulletForce = 5000; //Скорость патрона
public AudioClip Fire; //Аудиоклип воспроизводящийся во время стрельбы
public AudioClip Reload; //Аудиоклип воспроизводящийся во время перезарядки
private float ReloadTimer = 0.0f; //Переменная для таймаута перезарядки
private float MuzzleFlashLifetime = 0.0f; //Время жизни вспышки
// Use this for initialization

void Start ()
{
MuzzleFlash.active = false;    // вспышка невидима
}
// Update is called once per frame
void Update ()
{
if(Input.GetKeyUp(KeyCode.Mouse0)) //Если нажата ЛКМ и кол-во патронов больше 0
{
Shoot();
}

if(ReloadTimer>0)  //если таймер больше 0
{
ReloadTimer -= Time.deltaTime; //Переменная перезарядки уменьшается с течением времени
}
if(MuzzleFlashLifetime>0) //если время жизни вспышки больше 0
{
MuzzleFlashLifetime -= Time.deltaTime; //Переменная времени жизни вспышки уменьшается с течением времени
}
if(MuzzleFlashLifetime<=0)  //если время жизни вспышки больше 0
{
MuzzleFlash.active = false;  // вспышка невидима
}
}
void Shoot()
{
Transform BulletInstance = (Transform) Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint"
BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce"
audio.PlayOneShot(Fire);//проигрываем звук выстрела
MuzzleFlash.active = true; //вспышка от выстрела видна
MuzzleFlashLifetime = 0.1f; //установка времени жизни вспышки
}
}
robertonoДата: Суббота, 03 Августа 2013, 00:16 | Сообщение # 16
Чокнутый Кот
Сейчас нет на сайте
Adom, ох, прости Адом. Я никогда не работал с мультиплеером и + я не знаю что ты используешь для сервера (pyton, unity server)..
allodsДата: Суббота, 03 Августа 2013, 00:19 | Сообщение # 17
почти ветеран
Сейчас нет на сайте
Или пускай 100 рейкастов из зомби веером
Fr0sTДата: Суббота, 03 Августа 2013, 10:16 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Та не надо 100 рейкастов,можно угол вычитать между персонажем и зомби.С учетом поворота второго конечно.



AdomДата: Суббота, 03 Августа 2013, 15:09 | Сообщение # 19
Печенька!
Сейчас нет на сайте
Я использую unity server и обычные серверные скрипиты
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вопрос про OnTriggerStay
  • Страница 1 из 1
  • 1
Поиск:

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