Воскресенье, 28 Апреля 2024, 13:53

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вопрос-[ответ] по Unity (Задаём свои вопросы)
Вопрос-[ответ] по Unity
QWER56Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1
старожил
Сейчас нет на сайте
Вопрос-[Ответ] по Unity3d

  • База скриптов Unity3d
  • Курс Уроков по Unity 3D от Alcatraz

    ConsMark - поисковик по интернет магазинам.

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • DantorSДата: Суббота, 12 Июля 2014, 00:53 | Сообщение # 6281
    заслуженный участник
    Сейчас нет на сайте
    lentinant, raycastall проходит насквозь, через всю сцену - ну я так понял. Даже если я отделю все ненужные стены - как я определю точку соприкосновения со стеной

    Добавлено (12.07.2014, 00:53)
    ---------------------------------------------
    Вопрос - как определить с какой стороны лепить декаль остаётся открытым


    Сообщение отредактировал DantorS - Суббота, 12 Июля 2014, 01:00
    lentinantДата: Суббота, 12 Июля 2014, 05:54 | Сообщение # 6282
    ленивый программист
    Сейчас нет на сайте
    DantorS, вы что, на самом деле ничего не понимаете?
    Вот

    Пускаем рейкаст в сторону врага, сзади которого есть, припустим, две стены. RaycastAll получает точку столкновения (одну на объект, при выходе из объекта с обратной стороны мы не получаем столкновения) для каждого объекта, с которым столкнется (на рисунке - зеленые точки), и вся инфа о столкновении хранится в массиве типа RaycastHit. Координата столкновения хранится в переменной point этого класса, нормаль столкновения - в normal. Точка попадания во врага должна находиться ближе всего к игроку (у нас это а1), то есть, ее можно определить, пересмотрев все элементы массива и найдя тот, который ближе всего. А можно просто отсортировать, записав в виде
    Код
    а = Physics.RaycastAll(ray, raylength, layerMask2).OrderBy(h=>h.distance).ToArray();

    Это для шарпа. Во всяком случае, элемент, отвечающий за стену за врагом - второй по порядку (на рисунке а2). Вам нужен только он, на все следующие точки столкновения (а3) вы можете просто забить. Смотрите, не слишком ли далеко находятся а1 и а2, и если они довольно близко, помещаете в точку а2 (что-то например a[1].point) декаль, повернув его соответственно нормали. Получить вращение с нормали можно как-то в стиле
    Код
    Quaternion.LookRotation(a[1].normal)

    Вот и все. Разве это так сложно, что нужно на пальцах объяснять?


    Когда-то тут будут ссылки на крутые проекты. Или нет.

    Сообщение отредактировал lentinant - Суббота, 12 Июля 2014, 05:55
    DantorSДата: Суббота, 12 Июля 2014, 07:09 | Сообщение # 6283
    заслуженный участник
    Сейчас нет на сайте
    lentinant, спасибо.
    P.S.
    С raycastall раньше не работал. Думал он на выходе выдаёт только объекты, а не ткоординаты столкновения.
    AdomДата: Суббота, 12 Июля 2014, 16:12 | Сообщение # 6284
    Печенька!
    Сейчас нет на сайте
    Эмм. А что это за ошибка ?

    Код
    Sending RPC 'DamageGun_GR11' failed because the number of supplied parameters doesn't match the rpc declaration. Expected 0 but got 1 parameters.

    Код
    using UnityEngine;
    using System.Collections;

    public class GR_11 : MonoBehaviour {
    public RaycastHit Hit;  
    public AudioClip FireSound;  
    public Transform Cam;  
    public Transform bullet;    
    public int BulletForce = 5000;    
    public int CurAmmoCount = 100;  
    public int MaxAmmoCount = 100;  
    private float ReloadTimer = 0.0f;  
    public bool Reload;
    public int AmmoBoxWidth = 20;  //Ширина выводимого окна с информацией о кол-ве патронов
    public int AmmoBoxHeight = 100; //Высота выводимого окна с информацией о кол-ве патронов
    public int CurCatrige = 9;  //Текущее число обойм
    private GunMode _gunMode;//Переменная с помощью которой мы выбираем режим стрельбы
    private float BurstTime = 0;//Переменная необходимая для таймера перезарядки
    public float BurstRate = 0.1f;//Переменная отвечающая за скорострельность
    public Transform MuzzleFlash;
    private float MuzzleFlashLifetime = 0.0f;
    public GUISkin Skin;
    public float Damage;
    // Use this for initialization  
    enum GunMode{  //режим стрельбы
    single, //одиночный
    burst //очередь
    }
    void Start () {  
    _gunMode = GunMode.single; // режим стрельбы одиночный
    MuzzleFlash.active = false; // вспышка невидима
    }   
    // Update is called once per frame  
    void Update () {   
    if(networkView.isMine){
    if(BurstTime > 0){
    BurstTime -= Time.deltaTime;
    }
    if(Input.GetKeyDown(KeyCode.Q)){
    switch (_gunMode){
    case GunMode.single:
    _gunMode = GunMode.burst;
    break;
    case GunMode.burst:
    _gunMode = GunMode.single;
    break;
    }
    }
    if(Input.GetMouseButtonDown(0)&CurAmmoCount>0&ReloadTimer<=0&_gunMode == GunMode.single){ //Если нажата ЛКМ и кол-во патронов больше 0 и время перезарядки меньше или равно 0 и режим стрельбы одиночный  
    Single();
    }
    if(Input.GetMouseButton(0)&CurAmmoCount>0&ReloadTimer<=0&_gunMode == GunMode.burst&BurstTime <= 0){ //Если зажата ЛКМ и кол-во патронов больше 0 и время перезарядки меньше или равно 0 и режим стрельбы очередь и таймер очерди меньше или равно 0  
    Burst();
    }
    Vector3 Direction = Cam.TransformDirection(Vector3.forward);  
    if(Physics.Raycast(Cam.position, Direction, out Hit, 5000.0f)){   
    if(Hit.transform.name=="First Person Controller(Clone)"){     
    Hit.transform.networkView.RPC("DamageGun_GR11",RPCMode.AllBuffered,Hit.transform);
    Debug.Log("Hit");  
    }
    if(Hit.transform.GetComponent<HealthBox>().CurHealth<=0&&Hit.transform.name=="First Person Controller(Clone)"){    
    GameObject.FindWithTag("HealthBox").GetComponent<Skill>().CurLevel+=1;
    }
    if(Hit.transform.rigidbody&&Hit.collider.name=="Rigidbody"){  
    Hit.transform.rigidbody.AddForceAtPosition(Direction*1000, Hit.point);  
    }   
    //
    }     
    if(Input.GetKey(KeyCode.R)&ReloadTimer<=0&&CurAmmoCount<MaxAmmoCount){   
    ReloadTimer = 1.5f;
    CurCatrige = CurCatrige - 1;    //-1 обойма
    CurAmmoCount = MaxAmmoCount;    //Число патронов в обойме = максимальному числу патронов     
    Reload=true;
    }else{
    Reload=false;
    }
    if(ReloadTimer>0){  
    ReloadTimer -= Time.deltaTime;   
    }  
    if(ReloadTimer>0){
    ReloadTimer -= Time.deltaTime; //Переменная перезарядки уменьшается с течением времени
    }
    if(MuzzleFlashLifetime>0) {
    MuzzleFlashLifetime -= Time.deltaTime;  //Переменная времени жизни вспышки уменьшается с течением времени
    }
    if(MuzzleFlashLifetime<=0){                 //если время жизни вспышки больше 0  
    MuzzleFlash.active = false;             // вспышка невидима
    }
    }
    }
    void OnGUI(){
    if(networkView.isMine){
    GUI.skin=Skin;  
    GUI.Box(new Rect(Screen.width-200,0,200,100),""); //Вывод окна с инфой о патронах
    GUI.Label(new Rect(Screen.width-200,0,200,200),"Catrige:"+CurCatrige); //Вывод текста с инфой о обоймах
    GUI.Label(new Rect(Screen.width-200,25,200,200),"Ammo:"+CurAmmoCount+"/"+MaxAmmoCount);  
    }
    }
    public void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info){  
    if(stream.isWriting){  
    // Выполняется у владельца networkview;   
    // Сервер рассылает позицию по сети  
    Vector3 pos = transform.position;  
    stream.Serialize(ref pos);//"Кодирование" и рассылка  
    }else{  
    // Выполняется у всех остальных;   
    // Клиенты получают позицию и устанавливают ее  
    Vector3 posReceive = Vector3.zero;  
    stream.Serialize(ref posReceive); //"Декодирование" и прием  
    transform.position = posReceive;  
    }   
    }
    void Single(){
    Transform BulletInstance = (Transform)Network.Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity,0); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint"  
    BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce"  
    CurAmmoCount = CurAmmoCount - 1; //-1 патрон  
    audio.PlayOneShot(FireSound); //проигрываем звук выстрела //вспышка от выстрела видна  
    MuzzleFlash.active = true; //вспышка от выстрела видна
    MuzzleFlashLifetime = 0.1f; //установка времени жизни вспышки
    }
    void Burst(){
    BurstTime = BurstRate;//Промежуток времени между стрельбой
    Transform BulletInstance = (Transform)Network.Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity,0); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint"  
    BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce"  
    CurAmmoCount = CurAmmoCount - 1; //-1 патрон  
    audio.PlayOneShot(FireSound); //проигрываем звук выстрела //вспышка от выстрела видна  
    MuzzleFlash.active = true; //вспышка от выстрела видна
    MuzzleFlashLifetime = 0.1f; //установка времени жизни вспышки
    }
    }

    Отсюда вот.
    Storm54Дата: Суббота, 12 Июля 2014, 18:02 | Сообщение # 6285
    постоянный участник
    Сейчас нет на сайте
    В ошибке все написано. Засунь в переводчик и почитай. И зачем кидать огромный кусок говно кода? Никто его не будет читать.

    Если уж совсем все туго, то проблема здесь:
    Код
    Hit.transform.networkView.RPC("DamageGun_GR11",RPCMode.AllBuffered,Hit.transform);

    Ты отсылаешь 1 параметр, однако в объявленном RPC параметров 0.
    AdomДата: Суббота, 12 Июля 2014, 19:40 | Сообщение # 6286
    Печенька!
    Сейчас нет на сайте
    Цитата Storm54 ()
    Если уж совсем все туго, то проблема здесь:

    Я не настолько тупой как ты думаешь.

    Добавлено (12.07.2014, 19:40)
    ---------------------------------------------
    И еще одно.

    Что делать ? Просто кнопки и надписи наезжают друг на друга хотя не должны.

    allodsДата: Суббота, 12 Июля 2014, 22:56 | Сообщение # 6287
    почти ветеран
    Сейчас нет на сайте
    Цитата Adom ()
    Что делать ?

    Сухари сушить biggrin

    Сдвинуть их
    Я даже не знаю что добавить


    Сообщение отредактировал allods - Суббота, 12 Июля 2014, 22:56
    AdomДата: Суббота, 12 Июля 2014, 23:35 | Сообщение # 6288
    Печенька!
    Сейчас нет на сайте
    А можно ли как-то в игре создать префаб и засунуть его в папку ? Т.е берутся определенные объекты для них создается префаб и он кидается в папку.
    lentinantДата: Воскресенье, 13 Июля 2014, 00:34 | Сообщение # 6289
    ленивый программист
    Сейчас нет на сайте
    Adom, PrefabUtility.CreatePrefab

    Когда-то тут будут ссылки на крутые проекты. Или нет.
    richardknoxДата: Воскресенье, 13 Июля 2014, 15:54 | Сообщение # 6290
    был не раз
    Сейчас нет на сайте
    Камера не вращается вокруг объекта альтом. Что делать?
    allodsДата: Воскресенье, 13 Июля 2014, 17:53 | Сообщение # 6291
    почти ветеран
    Сейчас нет на сайте
    Чуть выше есть мой комент, посмотри....
    Там чет про сухари я писал...

    А вообще откуда мы знаем почему? Мы даже не знаем какой скрипт...
    AdomДата: Понедельник, 14 Июля 2014, 18:09 | Сообщение # 6292
    Печенька!
    Сейчас нет на сайте
    Я бы скинул но там ничего не прокомментировано и не понятно.
    Код
    using UnityEngine;
    using System.Collections;

    public class GUIMenu : MonoBehaviour {
    /*Menu*/
    public int Window;
    private int width = 1600;
    private int height = 900;
    private float Float_Resolution;
    private int IntResolution;  
    private string Width_String;
    private string Height_String;  
    public bool FullScreen=true;
    private float Float_Volume = 50;
    private int IntVolume;  
    private string Volume_String;
    public GUISkin Skin;
    public Font []font;
    public Font NewFont;
    public float Button_Height;
    public float Button_Widht;
      public GameObject World;
    /*Server*/
    public bool useNat;
    public string gameType;  
    public string gameName;  
    public int connectedPlayers;  
    public int playerLimit;  
    public string IP;
    public int port;  
    public bool passwordProtected;  
    public string comment;  
    public string guid;  
    /*Client*/
    void Start () {
    Skin.font=NewFont;  
    Skin.button.fontSize=15;  
    Window = 1;  
    }
    void  Awake (){
    MasterServer.RequestHostList("Fight");  
    }
    void Update(){
    if(Input.GetKeyDown(KeyCode.Escape)){
    Window=1;
    World.SetActive(false);
    World.GetComponent<WorldCreate>().enabled=false;
    Screen.showCursor=true;
    }
    }
    void OnGUI(){
    GUI.skin=Skin;   
    if(Window==1){    
    GUI.Box(new Rect(150,50,640,480),"Пауза");    
    if(GUI.Button(new Rect(150,25,125,75),"СозданиеМира")){
    Window=11;
    }  
    if(GUI.Button(new Rect(150,100,125,75),"Сервер&Клиент")){
    Window=8;
    }
    if(GUI.Button(new Rect(150,175,75,75),"Опции")){
    Window=2;      
    }
    if(GUI.Button(new Rect(150,250,75,75),"Выход")){  
    Application.Quit();      
    }
    }
    if (Window == 11) {
    World.SetActive(true);  
    World.GetComponent<WorldCreate>().enabled=true;
    }
    if(Window==2){
    if(GUI.Button(new Rect(300,150,75,50),"Экран")){//Экран      
    Window=3;       
    }
    if(GUI.Button(new Rect(300,200,50,50),"Звук")){//Звук
    Window=4;       
    }
    if(GUI.Button(new Rect(300,250,75,50),"Кнопки")){//Кнопки
    Window=6;       
    }
    if(GUI.Button(new Rect(300,300,150,50),"Интерфейс")){//Интерфейс
    Window=7;       
    }     
    if(GUI.Button(new Rect(300,350,75,75),"Назад")){//Назад
    Window=1;       
    }
    if(Input.GetKeyUp(KeyCode.Escape)){//Назад     
    Window=1;      
    }     
    }
    if(Window==3){//Экран
    GUI.Box(new Rect(300,50,640,480),"Экран");
    Float_Resolution = GUI.HorizontalSlider(new Rect(300,150,100,30),Float_Resolution, 0, 4);   
    IntResolution = (int)Float_Resolution;
    //
    if(IntResolution==0){
    width = 640;
    height = 480;
    Width_String = width.ToString();
    Height_String = height.ToString();      
    }
    if(IntResolution==1){
    width = 1024;
    height = 768;
    Width_String = width.ToString();
    Height_String = height.ToString();       
    }
    if(IntResolution==2){
    width = 1366;
    height = 768;
    Width_String = width.ToString();
    Height_String = height.ToString();       
    }
    if(IntResolution==3){
    width = 1600;
    height = 900;
    Width_String = width.ToString();
    Height_String = height.ToString();       
    }
    GUI.Label(new Rect(430,145,100,25),Height_String);
    GUI.Label(new Rect(400,145,100,25),Width_String);  
    FullScreen = GUI.Toggle (new Rect(300,180,180,30), FullScreen, "Полный Экран");   
    if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад
    Window=2;       
    }     
    }
    if(Window==4){    
    GUI.Box(new Rect(300,50,640,480),"Звук");
    Float_Volume=GUI.HorizontalSlider(new Rect(300,150,100,30),Float_Volume,0,100);  
    IntVolume=(int)Float_Volume;
    Volume_String=IntVolume.ToString();
    GUI.Label(new Rect(400,145,100,25),Volume_String);  
    if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад
    Window=2;       
    }
    }
    if(Window==7){     
    GUI.Label(new Rect(450,50,150,50),"Цвета");      
    if(GUI.Button(new Rect(450,100,75,25),"Ченрый")){
    Skin.button.normal.textColor=Color.black;  
    Skin.label.normal.textColor=Color.black;    
    }
    if(GUI.Button(new Rect(450,125,75,25),"Синий")){
    Skin.button.normal.textColor=Color.blue;  
    Skin.label.normal.textColor=Color.blue;     
    }
    if(GUI.Button(new Rect(450,150,75,25),"Голубой")){
    Skin.button.normal.textColor=Color.cyan;  
    Skin.label.normal.textColor=Color.cyan;     
    }
    if(GUI.Button(new Rect(450,175,75,25),"Серый")){
    Skin.button.normal.textColor=Color.gray;
    Skin.label.normal.textColor=Color.gray;     
    }
    if(GUI.Button(new Rect(450,200,75,25),"Пурпурный")){
    Skin.button.normal.textColor=Color.magenta;   
    Skin.label.normal.textColor=Color.magenta;      
    }
    if(GUI.Button(new Rect(450,225,75,25),"Красный")){
    Skin.button.normal.textColor=Color.red;  
    Skin.label.normal.textColor=Color.red;     
    }
    if(GUI.Button(new Rect(450,250,75,25),"Белый")){
    Skin.button.normal.textColor=Color.white;  
    Skin.label.normal.textColor=Color.white;     
    }  
    if(GUI.Button(new Rect(450,275,75,25),"Желтый")){
    Skin.button.normal.textColor=Color.yellow;  
    Skin.label.normal.textColor=Color.yellow;      
    }
    if(GUI.Button(new Rect(450,300,75,25),"Зеленый")){
    Skin.button.normal.textColor=Color.green;  
    Skin.label.normal.textColor=Color.green;      
    }    
    if(GUI.Button(new Rect(450,325,75,75),"Назад")){//Назад
    Window=2;       
    }  
    GUI.Label(new Rect(600,50,150,50),"Шрифт");  
    if(GUI.Button(new Rect(600,100,50,25),"0")){
    Skin.font=font[0];  
    Skin.button.fontSize=15;    
    }
    if(GUI.Button(new Rect(600,125,50,25),"1")){
    Skin.font=font[1];  
    Skin.button.fontSize=10;      
    }
    if(GUI.Button(new Rect(600,150,50,25),"2")){
    Skin.font=font[2];  
    Skin.button.fontSize=15;      
    }
    if(GUI.Button(new Rect(600,175,50,25),"3")){
    Skin.font=font[3];  
    Skin.button.fontSize=15;      
    }
    if(GUI.Button(new Rect(600,200,50,25),"4")){
    Skin.font=font[4];
    Skin.button.fontSize=11;      
    }
    if(GUI.Button(new Rect(600,225,50,25),"5")){
    Skin.font=font[5];  
    Skin.button.fontSize=12;      
    }
    if(GUI.Button(new Rect(600,250,50,25),"6")){
    Skin.font=font[6];  
    Skin.button.fontSize=12;      
    }
    if(GUI.Button(new Rect(600,275,50,25),"7")){
    Skin.font=font[7];  
    Skin.button.fontSize=10;      
    }
    if(GUI.Button(new Rect(600,300,50,25),"8")){
    Skin.font=font[8];  
    Skin.button.fontSize=15;      
    }
    if(GUI.Button(new Rect(600,325,50,25),"9")){
    Skin.font=font[9];
    Skin.button.fontSize=13;      
    }
    if(GUI.Button(new Rect(600,350,50,25),"10")){
    Skin.font=font[10];
    Skin.button.fontSize=15;      
    }
    }  
    if(Window==6){   
    if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад
    Window=2;       
    }    
    }
    if(Window==8){
    if(GUI.Button(new Rect(150,400,75,75),"Назад")){//Назад
    Window=1;
    }
    if(GUI.Button(new Rect(150,250,75,75),"Сервер")){
    Window=9;      
    }
    if(GUI.Button(new Rect(150,325,75,75),"Клиент")){
    Window=10;      
    }
    }
    if(Window==9){
    GUI.Box(new Rect(190,0,175,250),"ServerSettings");   
    GUI.Label(new Rect(200,25,150,25),"GameType");
    gameType=GUI.TextArea(new Rect(202.5f,50,150,25),gameType);
    //
    GUI.Label(new Rect(200,75,150,25),"Comment");
    comment=GUI.TextArea(new Rect(202.5f,100,150,25),comment);
    //
    GUI.Label(new Rect(200,125,150,25),"GameName");
    gameName=GUI.TextArea(new Rect(202.5f,150,150,25),gameName);  
    //
    guid=Network.player.guid;
    if(GUI.Button(new Rect(202.5f,175,150,50),"Start Server")){     
    Network.InitializeServer(32, 25002, Network.HavePublicAddress());
    MasterServer.RegisterHost(gameType,gameName,comment);  
    enabled=false;
    }
    if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад
    Window=8;       
    }  
    }
    if (Window == 10) {
    HostData[] data = MasterServer.PollHostList();
    foreach(var element in data){
    GUILayout.BeginHorizontal();  
    name=element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit;
    string hostInfo;
    hostInfo = "[";
    foreach(var host in element.ip)
    hostInfo = hostInfo + host + ":" + element.port + " ";
    hostInfo = hostInfo + "]";
    //
    GUI.Box(new Rect(0,0,175,250),"Clent");   
    GUI.Label(new Rect(0,25,150,50),hostInfo);  
    GUI.Label(new Rect(155,25,150,50),"-Ip");
    //
    GUI.Label(new Rect(95,50,150,50),"-ServerName");
    GUI.Label(new Rect(0,50,150,50),element.comment);
    //
    GUI.Label(new Rect(125,75,150,50),"-Players");
    GUI.Label(new Rect(0,75,150,50),name);    
    //
    if(GUI.Button(new Rect(0,175,175,50),"Connect")){
    enabled=false;
    Network.Connect(element);  
    }
    if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад
    Window=8;       
    }  
    GUILayout.EndHorizontal();  
    }
    }
    }
    }

    Вот=)

    Добавлено (14.07.2014, 18:09)
    ---------------------------------------------
    Пока вы не ответили на предыдущий вопрос задам еще один.
    Есть игрок и есть его оружие сначала все хорошо каждый игрок стреляет своим оружием. Но когда A-Игрок умирает то он стреляет уже не из своего оружия а из оружия B-Игрока. Хотя сам префаб игрока не уничтожался а просто выключился и включился . Что делать ?
    Если нужно то могу предоставить код стрельбы.

    richardknoxДата: Понедельник, 14 Июля 2014, 21:07 | Сообщение # 6293
    был не раз
    Сейчас нет на сайте
    Вы меня не так поняли когда я закидываю в юнити объект то вокруг него нельзя вращаться и двойное нажатие мышкой в иерархии не работает
    AdomДата: Понедельник, 14 Июля 2014, 21:43 | Сообщение # 6294
    Печенька!
    Сейчас нет на сайте
    richardknox, Эмм. не знаю . Единственное что приходит в голову что у тебя стоит галочка static это гд название объекта чуть ниже и правее.
    berilДата: Понедельник, 14 Июля 2014, 23:18 | Сообщение # 6295
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Можно ли сделать так, что бы когда запустил приложение в инспекторе, при изменении значений переменных, они сохранялись после того когда останавливаешь игру?



    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    allodsДата: Вторник, 15 Июля 2014, 02:02 | Сообщение # 6296
    почти ветеран
    Сейчас нет на сайте
    Цитата beril ()
    Можно ли сделать так, что бы когда запустил приложение в инспекторе, при изменении значений переменных, они сохранялись после того когда останавливаешь игру?

    Только скопировать и вставить после того как остановил , я думаю только так
    JonLivingstonДата: Вторник, 15 Июля 2014, 16:08 | Сообщение # 6297
    почетный гость
    Сейчас нет на сайте
    Как отключить управление движением FPSКонтроллера (стандартного) при столкновении с триггером?

    Сейчас делаю это так:

    Код

    void OnTriggerEnter(Collider cube)
       {
        if(cube.collider.tag == "Player")
        {
                //motor - объект стандартного CharacterMotor

                motor.movement.maxForwardSpeed = 0;
                motor.movement.maxSidewaysSpeed = 0;
                motor.movement.maxBackwardsSpeed = 0;     
        }
       }


    Но сея конструкция работает, только если в зоне триггера отпустить клавишу движения (дать контроллеру остановиться). Иначе игрок просто пробегает ее.


    "Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах
    Наша первая игра Dark Forest
    Let's play на Dark Forest


    Сообщение отредактировал JonLivingston - Вторник, 15 Июля 2014, 16:10
    VoreshДата: Вторник, 15 Июля 2014, 21:14 | Сообщение # 6298
    частый гость
    Сейчас нет на сайте
    Добрый день.
    Подскажите, пожалуйста, как лучше реализовать стрельбу в 2d пространстве?
    При нажатии ПКМ, я спавню снаряд(геймобжект). Его надо занести в массив снарядов.
    В ф-ции апдейта двигать массив снарядов и если какой-то из них сталкивается с препятствием или улетает за конец экрана, то ячейку массива надо почистить.
    А как работать с этими дырами в массиве? Как его сортировать? Куда потом заносить переменную нового снаряда? Подскажите, пожалуйста, статьи на эту тему.
    И, неплохо бы что-то про динамическое выделение памяти. Спасибо smile
    JonLivingstonДата: Вторник, 15 Июля 2014, 22:21 | Сообщение # 6299
    почетный гость
    Сейчас нет на сайте
    Voresh, советую почитать про пул объектов. Например, здесь. Если я правильно понял проблему. А вообще, зависит от очень многих факторов (конкретных примеров кода, который ты используешь).

    А если в общем, пробегаешь циклом foreach по динамическому List массиву, и если obj.isDeative, Remove() его или в стартовую позицию. Ну, в общем, нужно смотреть на конкретном примере, как это у тебя работает.


    "Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах
    Наша первая игра Dark Forest
    Let's play на Dark Forest


    Сообщение отредактировал JonLivingston - Вторник, 15 Июля 2014, 22:31
    lentinantДата: Среда, 16 Июля 2014, 22:40 | Сообщение # 6300
    ленивый программист
    Сейчас нет на сайте
    Voresh, во первых, довольно глупо двигать снаряды с одного скрипта. Проще сделать скрипт снаряда, который будет отвечать именно за этот снаряд (мол, выстрелили - теперь ты сам по себе). Тогда, в принципе, и в массив ничего заносить не нужно.

    Если же вам, все таки, нужен массив (например, ограничение количества одновременно созданных снарядов), тогда вы можете использовать списки (List для C#, ArrayList для JavaScript), в них уже предусмотрены методы для извлечения элемента с автоматической сортировкой. Тогда вы просто при создании снаряда кешируете в его скрипте объект, которым создаете снаряды, и в коде уничтожения снаряда просто вызываете метод извлечения экземпляра.


    Когда-то тут будут ссылки на крутые проекты. Или нет.
    Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вопрос-[ответ] по Unity (Задаём свои вопросы)
    Поиск:

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