Пятница, 19 Апреля 2024, 03:00

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Запуск скрипта в других скриптах
Запуск скрипта в других скриптах
q1w287Дата: Среда, 09 Марта 2016, 13:37 | Сообщение # 1
частый гость
Сейчас нет на сайте
Есть скрипт
Код
public class randomizer : MonoBehaviour {

public void fear()
{
    int rand = Random.Range(0, 100);
    if (rand<55){
        Debug.Log("нападают");
    }
    if (rand >= 55) {
        Debug.Log("убегают");      
    }

}

}


Каким образом можно запустить следующий срипт
Код
public class enemy : MonoBehaviour {
    private Vector3 Player;
    private Vector2 PlayerDirection;
    private float Xdif;
    private float Ydif;
    private float speed;
    private float distance;
    private bool stun;
    private float stuntime;
    // Use this for initialization
    void Start () {
        stuntime = 0;
        stun = false;
        speed = 6;
    }

    // Update is called once per frame
    public void Update () {
        distance = Vector2.Distance (Player, transform.position);
        Player = GameObject.Find ("Player").transform.position;
        if (stuntime > 0) {
            stuntime -=Time.deltaTime;
                } else {
            stun = false;
                }
        if (distance < 25 & !stun) {
                        Xdif = Player.x - transform.position.x;
                        Ydif = Player.y - transform.position.y;
                        PlayerDirection = new Vector2 (Xdif, Ydif);
                        GetComponent<Rigidbody2D>().AddForce (PlayerDirection.normalized * speed);
                }
    }
    void OnCollisionEnter2D(Collision2D Playerhit){
                if (Playerhit.gameObject.tag == "Player") {
                        stun = true;
                        stuntime = 1;
                }
    }
}


Например в месте где указано
Код
Debug.Log("нападают");
EgoorДата: Среда, 09 Марта 2016, 14:26 | Сообщение # 2
участник
Сейчас нет на сайте
q1w287, в смысле запустить? Какую то функцию из скрипта или просто динамически прикрепить скрипт к объекту? В твоем случае я думаю ты хотел сделать второе.
Код

this.gameObject.AddComponent<Enemy>();


Кстати, то что ты в Update ищешь каждый раз Player - это очень дорого.
Код
Player = GameObject.Find ("Player").transform.position;

Разумнее делать так:
Код

GameObject playerObj;

void Start(){
...
playerObj = GameObject.Find ("Player");
...
}

void Update(){
...
Player = playerObj.transform.position;
...
}


Тоже самое и с
Код
GetComponent<Rigidbody2D>()


И еще для полноты картины это
Код
if (Playerhit.gameObject.tag == "Player") {

заменить на
Код
if (Playerhit.gameObject.CompareTag("Player")) {


Сообщение отредактировал Egoor - Среда, 09 Марта 2016, 15:16
q1w287Дата: Вторник, 15 Марта 2016, 12:12 | Сообщение # 3
частый гость
Сейчас нет на сайте
Egoor, спасибо все поправил. А вот по самому вопросу. Хочу сделать следующее. На всех врагах висит скрипт "enemy". По этому скрипту если игрок подходит на определенное расстояние, враг нападает. Есть скилл "напугать врагать". Он рандомный, т.е. типа, то сработает напугать, то нет. Если сработает, враг должен убегать от игрока, если нет то продолжает нападать. Пытаюсь сделать так:
Код
public class randomizer : MonoBehaviour {
    public enemy enemyRun;
    
    private Vector3 Player;

public void fear()
        {
    int rand = Random.Range(0, 100);
   if (rand<55){
    enemyRun.Update();
    Debug.Log("нападают");
  }
  if (rand >= 55) {
   enemyRun.Xdif = Player.x + transform.position.x;
   enemyRun.Ydif = Player.y + transform.position.y;
   enemyRun.Update();
   Debug.Log("убегают");  
  }

    }

}

Т.е. по сути если выпадет rand<55, то враг продолжает нападать, если выпадет rand>=55 то нужно чтобы вызвался Update() с новыми Xdif и Ydif. И да, это срабатывает по нажатию кнопки.


Сообщение отредактировал q1w287 - Вторник, 15 Марта 2016, 12:14
EgoorДата: Среда, 16 Марта 2016, 03:42 | Сообщение # 4
участник
Сейчас нет на сайте
q1w287, надеюсь дойдет.

Код

void Update() {

if(isEnemyFear){
  EnemyFear();
}
else{
  EnemyAttack();
}

}

void CheckFear(){
  if(rand > 55)
     isEnemyFear = true;
}

void EnemyFear(){

// Враги убегают

}

void EnemyAttack(){

// Враги атакуют

}

q1w287Дата: Пятница, 18 Марта 2016, 13:46 | Сообщение # 5
частый гость
Сейчас нет на сайте
Egoor, большое спасибо, все дошло. Есть только один нюанс. Как грамотно это повесить на кнопку, чтобы срабатывала для всех врагов.
Сейчас этот скрипт выглядит так:
Код
public class randomizer : MonoBehaviour {
    private Vector3 Player;
    private Vector2 PlayerDirection;
    public float Xdif;
    public float Ydif;
    private float speed;
    private float distance;
    private bool stun;
    private float stuntime;
    private bool isEnemyFear;
    GameObject playerObj;
    private Rigidbody2D myRigidbody2D;
    // Use this for initialization
    void Start () {
  stuntime = 0;
  stun = false;
  speed = 6;
  playerObj = GameObject.Find ("Player");
  myRigidbody2D = GetComponent<Rigidbody2D>();
    }
    
    // Update is called once per frame
    public void Update () {
  distance = Vector2.Distance (Player, transform.position);
  Player = playerObj.transform.position;
  if (stuntime > 0) {
   stuntime -=Time.deltaTime;
    } else {
   stun = false;
    }
  if(isEnemyFear){
   EnemyFear();
  }
  else{
   EnemyAttack();
  }
    }

    public void CheckFear(){
  int rand = Random.Range(0, 100);
  if(rand > 35)
   isEnemyFear = true;
    }

    void EnemyAttack(){
  
  if (distance < 25 & !stun) {
   Xdif = Player.x - transform.position.x;
   Ydif = Player.y - transform.position.y;
   PlayerDirection = new Vector2 (Xdif, Ydif);
   myRigidbody2D.AddForce (PlayerDirection.normalized * speed);
   Debug.Log("нападают");
  }    
    }
    
    void EnemyFear(){
  
  if (distance < 25 & !stun) {
   Xdif = Player.x + transform.position.x;
   Ydif = Player.y + transform.position.y;
   PlayerDirection = new Vector2 (Xdif, Ydif);
   myRigidbody2D.AddForce (PlayerDirection.normalized * speed);
   Debug.Log("убегают");
  }
  StartCoroutine(Timer());
    }
  
    void OnCollisionEnter2D(Collision2D Playerhit){
    if (Playerhit.gameObject.CompareTag("Player")) {
      stun = true;
      stuntime = 1;
    }
    }
    IEnumerator Timer() {
  yield return new WaitForSeconds(10);
  isEnemyFear = false;
  StopCoroutine ("Timer");
    }

}

Сейчас если повесить скрипт на врага, все работает но только с этим врагом, так как кнопка обращается к определенному объекту Если же отдельно на пустой объект повесить само собой в transform.position не идут позиции врагов. Пробовал через поиск по тегу "enemy". Но тогда надо как-то находить определенного врага (который рядом с игроком) из массива. Или меня не туда понесло?


Сообщение отредактировал q1w287 - Пятница, 18 Марта 2016, 15:05
EgoorДата: Пятница, 18 Марта 2016, 18:14 | Сообщение # 6
участник
Сейчас нет на сайте
q1w287, напишите менеджер логики врагов, занесите всех врагов в массив, а там уже выбирайте, кто ближе.
q1w287Дата: Четверг, 24 Марта 2016, 13:32 | Сообщение # 7
частый гость
Сейчас нет на сайте
Egoor, если я правильно понимаю вышеуказанный скрипт описывает логику врагов.
всех врагов запихиваем в массив, таким образом?
Код
GameObject[] enemies;
enemies = GameObject.FindGameObjectsWithTag("enemy");

еще у меня есть функция которая ищет ближайшего врага к игроку
Код
GameObject FindClosestEnemy() {
  GameObject[] gos;
  gos = GameObject.FindGameObjectsWithTag("enemy");
  //GameObject closest;
  float distance = Mathf.Infinity;
  Vector3 position = transform.position;
  foreach (GameObject go in gos) {
   Vector3 diff = go.transform.position - position;
   float curDistance = diff.sqrMagnitude;
   if (curDistance < distance) {
    closest = go;
    distance = curDistance;
   }
  }
  return closest;}

но как все это связать вместе что-то никак не доходит?
EgoorДата: Четверг, 24 Марта 2016, 15:22 | Сообщение # 8
участник
Сейчас нет на сайте
q1w287, создайте скрипт на враге, сделайте там переменную bool, если он боится. И из главного скрипта, после нахождения врагов в некотором радиусе меняйте ее у всех этих врагов. В скрипте врага и делайте логику страха и т.п.
q1w287Дата: Среда, 30 Марта 2016, 10:08 | Сообщение # 9
частый гость
Сейчас нет на сайте
Egoor, получается так.
Скрипт на врагах:
Код
public class enemy : MonoBehaviour {
    private Vector3 Player;
    private Vector2 PlayerDirection;
    public float Xdif;
    public float Ydif;
    private float speed;
    private float distance;
    private bool stun;
    private float stuntime;
    GameObject playerObj;
    private Rigidbody2D myRigidbody2D;
    private bool isEnemyFear;
    public randomizer fear;
    // Use this for initialization
    void Start () {
  stuntime = 0;
  stun = false;
  speed = 6;
  playerObj = GameObject.Find ("Player");
  myRigidbody2D = GetComponent<Rigidbody2D>();
    }
    
    // Update is called once per frame
    public void Update () {
  distance = Vector2.Distance (Player, transform.position);
  Player = playerObj.transform.position;
  if (stuntime > 0) {
   stuntime -=Time.deltaTime;
  } else {
   stun = false;
  }
  if(fear.CheckFear()){
   EnemyFear();
  }
  else{
   EnemyAttack();
  }
  
    }
    void EnemyAttack(){
  
  if (distance < 25 & !stun) {
   Xdif = Player.x - transform.position.x;
   Ydif = Player.y - transform.position.y;
   PlayerDirection = new Vector2 (Xdif, Ydif);
   myRigidbody2D.AddForce (PlayerDirection.normalized * speed);
   Debug.Log("нападают");
  }    
    }
    
    void EnemyFear(){
  
  if (distance < 25 & !stun) {
   Xdif = Player.x + transform.position.x;
   Ydif = Player.y + transform.position.y;
   PlayerDirection = new Vector2 (Xdif, Ydif);
   myRigidbody2D.AddForce (PlayerDirection.normalized * speed);
   Debug.Log("убегают");
  }
  StartCoroutine(Timer());
    }
    
    void OnCollisionEnter2D(Collision2D Playerhit){
  if (Playerhit.gameObject.CompareTag("Player")) {
   stun = true;
   stuntime = 1;
  }
    }
    IEnumerator Timer() {
  yield return new WaitForSeconds(10);
  isEnemyFear = false;
  StopCoroutine ("Timer");
    }
    
}


Скрипт на кнопке:
Код
public class randomizer : MonoBehaviour {

    private bool isEnemyFear;

    public void CheckFear(){
  int rand = Random.Range(0, 100);
  if(rand > 35)
   isEnemyFear = true;
    }

}


Как
Код
isEnemyFear = true
передать в скрипт на врагах?

ps. извините за возможные глупости.

Добавлено (30 марта 2016, 10:08)
---------------------------------------------
может кто-то еще кроме Egoor, может натолкнуть на решение?

Сообщение отредактировал q1w287 - Четверг, 24 Марта 2016, 22:21
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Запуск скрипта в других скриптах
  • Страница 1 из 1
  • 1
Поиск:

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