Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
1

Учимся передвигаться

25.09.2014, 16:10. Показов 1535. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Я недавно начала изучать Unity и C#, так что не судите строго.
Пытаюсь заставить объект передвигаться (не силой мысли, а то у меня бы уже все бегало ).
Есть класс Unit как базовый, и класс Archer его наследник. Объекты создаются через класс Create.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Collections;
using System;
 
public class towerDefense : MonoBehaviour
{
 
    public GameObject Kira;
    public Archer archer;
    
    void Start()
        
    {  
       Creator creators = new ArcherCreator();
       archer = (Archer)creators.CreatorMetod(10, new Vector3(216, 1, 204), new Vector3(216, 1, 272), 1);
 
       archer.AddToScene(Kira);
    }
 
    void Update()
    {
        archer.WalkTo(Kira, archer.Position);
    }
 
     
    public class Unit
    {      
       
        public Vector3 StartPosition;
        public Vector3 FinishPosition;
        public int NumberOfLife;
        public int Speed;
        public Vector3 Position;
        
        
        //метод добавляет префаб на сцену
        public void AddToScene(GameObject name)
        {
            name = (GameObject)Instantiate(Resources.Load("ArcherPrefab"), StartPosition, Quaternion.identity);
            Position = name.transform.position;
            
        }
 
        //метод Хотьбы
        public void WalkTo(GameObject name, Vector3 Position)
        {
           name.transform.Translate(new Vector3(0, 0, name.transform.position.z+Spead) * Time.deltaTime);
        }
        public Unit(){}
 
        //конструктор
        public Unit(int NumberOfLife, Vector3 StartPosition, Vector3 FinishPosition, int Speed)
        {
            this.NumberOfLife = NumberOfLife;
            this.StartPosition = StartPosition;
            this.FinishPosition = FinishPosition;
            this.Speed = Speed;
        }
    }
 
   public class Archer : Unit
   {
       
       public Archer(int NumberOfLife, Vector3 StartPosition, Vector3 FinishPosition, int Speed)
           : base(NumberOfLife, StartPosition, FinishPosition, Speed)
       {
           //бла-бла-бла
       }
    }
 
   public abstract class Creator
   {
       public abstract Unit CreatorMetod(int NumberOfLife, Vector3 StartPosition, Vector3 FinishPosition, int Speed);
   }
 
   public class ArcherCreator : Creator
   {
       public override  Unit CreatorMetod(int NumberOfLife, Vector3 StartPosition, Vector3 FinishPosition, int Speed)
       {
           return new Archer(NumberOfLife, StartPosition, FinishPosition, Speed);
       }
 
 
   }
}
Добавлено через 7 минут
Продолжение)) Ну все не как у людей)) .Так вот когда я запускаю метод WalkTo в Update, то мой объект не хочет передвигаться, при этом выдает name.transform.position как (0,0,0) Хотя это не так. Ведь я в Start его добавила на сцену и его позиция вовсе не 0,0,0.

Добавлено через 6 минут
Я перепробовала уже множество вариантов. Крутила и так и сяк. И глобально(на сколько в c# это возможно) задавала координаты своего объекта, перзаписывала...короче белебердой занималась. Вот если просто не метод вызывать, а в update написать к примеру
C#
1
Kira.transform.Translate(new Vector3(0, 0, archer.Spead) * Time.deltaTime);
, то все ок, все движется. А вот запуская метод нет! Понимаю, что половина написанного - бред. Но как-то же люди учатся
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2014, 16:10
Ответы с готовыми решениями:

Как передвигаться между MergedCells в строке?
Application.SendKeys('{RIGHT}') что-то подглючивает, нужен другой способ.

Учимся вместе
Ребят, всем привет! Недавно понял что жизнь моя скучна и уныла, и что пора ее чем нибудь...

Как передвигаться по матрице указателей, не используя цикл
Здравствуйте. Дали задание. Нужно производить разные несложные действия с матрицей указателей....

Крестики нолики(учимся)
Всем привет, изучаю java со всем не много и взбрела в голову идея написать игру крестики нолики)...

14
69 / 70 / 19
Регистрация: 01.05.2013
Сообщений: 279
25.09.2014, 16:50 2
Как я понял, этой строкой
archer.AddToScene(Kira);
мы вызываем
C#
1
2
3
4
5
6
public void AddToScene(GameObject name)
        {
            name = (GameObject)Instantiate(Resources.Load("ArcherPrefab2"), StartPosition, Quaternion.identity);
            Position = name.transform.position;
            
        }
А зачем мы в метод посылаем kira, если
C#
1
name = (GameObject)Instantiate(Resources.Load("ArcherPrefab2"), StartPosition, Quaternion.identity);
мы присваиваем сразу переменной name новый объект?
P.S.В классах сам не профи, мог что-то не увидить
0
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
25.09.2014, 16:56  [ТС] 3
по идее я делаю универсальный метод, чтобы я в любое время могла добавить на сцену любой объект, те будь то kira или другой какой. Ведь у меня не только класс лучников будет, он и мечники, маги , к примеру. И для каждого класса писать метод добавления на сцену, не хочется. Короче как-то так я себе это представляю))
0
69 / 70 / 19
Регистрация: 01.05.2013
Сообщений: 279
25.09.2014, 17:00 4
Я спросил не про это.
Вы вызываете метод. Присваиваете переменной name переменную kira. И ТУТ ЖЕ присваиваете переменной name новый объект. Возможно вам нужно вернуть новый объект в переменную kira? То есть чтобы после метода в переменной Kira был созданный объект?
1
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
25.09.2014, 17:19  [ТС] 5
да, тут есть над чем подумать...

Добавлено через 6 минут
Да, точно, вы правы! Спасибо. Буду исправлять
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
05.10.2014, 23:58 6
Цитата Сообщение от Lina208 Посмотреть сообщение
по идее я делаю универсальный метод, чтобы я в любое время могла добавить на сцену любой объект, те будь то kira или другой какой. Ведь у меня не только класс лучников будет, он и мечники, маги , к примеру. И для каждого класса писать метод добавления на сцену, не хочется. Короче как-то так я себе это представляю))
Если я правильно вас понял, то вам нужно просто создать класс(родитель) Воин (например) - А класс Лучником,Мечников,Магов и так далее - будут просто наследовать класс Воина и тогда вы сможете сделать метод для добавления воина - а какой воин будет - не важно
0
52 / 52 / 7
Регистрация: 13.10.2012
Сообщений: 180
06.10.2014, 01:29 7
можно просто сделать компонент, CharacterController и в нем реализовать базовое передвижение, при необходимости добавить нужный функционал, просто наследуемся от данного класса, контроль здоровья - в отдельный компонент, контроль анимаций (эффектов и прочей вью), в отдельный
1
28 / 28 / 3
Регистрация: 09.09.2012
Сообщений: 131
06.10.2014, 09:42 8
int_array как всегда опередил)
Он прав насчет создания модели для группы объектов с одинаковым поведением(наличие очков жизни, движение, возможность атаки и тд), и от него наследовать всех последующих персонажей(классы их). Или можно сделать общую модель поведения и в ней дать возможность определения типа класса персонажа, это даст возможность иметь общий скелет.
0
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
08.10.2014, 23:37  [ТС] 9
David-Net
Если я правильно вас понял, то вам нужно просто создать класс(родитель) Воин (например) - А класс Лучником,Мечников,Магов и так далее - будут просто наследовать класс Воина и тогда вы сможете сделать метод для добавления воина - а какой воин будет - не важно
Есл я правильно вас поняла, то у меня в данном коде так и реализовано. Те , у меня есть родительский класс Unit , в котором есть метод Walk. От Unit наследуются Archer,... И значит объекту типа Archer доступен метод Walk. Но я у меня не вышло заставить передвигаться объект типа Archer, подозреваю, что просто не к тому обращалась или не так. Поэтому я сделала по другому. Я сделала 2 файла, в 1-м иерархия классов моих юнитов, а во втором непосредственно метод движения, 2-й файл я навешиваю на пребаф , который будет добавлен и на сцену при загрузке программы. Вот при такой белеберде))) заработало)

Добавлено через 9 минут
int_array, scotty,Скажите я правильно вас поняла. У меня должно получится к примеру 2 C# скрипта. 1-й управляющий, в котором прописываются классы, их свойства, конструкторы... иерархия классов. А во 2-м скрипте располагаются просто методы, и 2-й скрипт я навешиваю в самом юнити на объекты сцены. (этот вариант у меня заработал) Или же у меня должно выйти 1 скрипт, в котором мои повторяющиеся методы (те все общие методы наследников) я помещаю в родительский класс? Если честно я уже запуталась , но хочется научиться делаться правильно, по-человечески. Заранее спасибо

Добавлено через 6 минут
Или так: в одном файле иерархия классов, в родительский помещаем этот метод движения, тк повторяется у всех наследников, а затем отдельный скрипт для атаки, отдельный для (как вы писали) здоровье, отдельный подсчет итоговых очков.....Да...наверное, вы это имели ввиду. Думаю так лучше всего
0
52 / 52 / 7
Регистрация: 13.10.2012
Сообщений: 180
09.10.2014, 00:03 10
Цитата Сообщение от Lina208 Посмотреть сообщение
Скажите я правильно вас поняла. У меня должно получится к примеру 2 C# скрипта. 1-й управляющий, в котором прописываются классы, их свойства, конструкторы... иерархия классов. А во 2-м скрипте располагаются просто методы, и 2-й скрипт я навешиваю в самом юнити на объекты сцены. (этот вариант у меня заработал) Или же у меня должно выйти 1 скрипт, в котором мои повторяющиеся методы (те все общие методы наследников) я помещаю в родительский класс? Если честно я уже запуталась , но хочется научиться делаться правильно, по-человечески. Заранее спасибо
Добавлено через 6 минут
Или так: в одном файле иерархия классов, в родительский помещаем этот метод движения, тк повторяется у всех наследников, а затем отдельный скрипт для атаки, отдельный для (как вы писали) здоровье, отдельный подсчет итоговых очков.....Да...наверное, вы это имели ввиду. Думаю так лучше всего
нет, вы не совсем правильно все поняли, Unity предоставляет разработчику довольно эффективную компонентную модель, которой грех не пользоваться. Вам нужно будет создать 3, 4, 10, 20 скриптов, а то и больше, каждый из которых будет отвечать за свою задачу, все наследуются от MonoBehaviour и навешиваются на го как компоненты.
0
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
09.10.2014, 00:13  [ТС] 11
int_array,Уж извините за тугодумность. Те вариант, где я свой метод движения в отдельный файл запихнула и навесила на нужный префаб - это правильно?
0
52 / 52 / 7
Регистрация: 13.10.2012
Сообщений: 180
09.10.2014, 00:21 12
Лучший ответ Сообщение было отмечено Lina208 как решение

Решение

я не дописал =)
например клас Unit
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using UnityEngine;
 
// общий класс, отвечающий за игровую сущность в целом, наследуется
public class Unit : MonoBehaviour {
 
    // в полях может содержать например 
    public float HP;
    public float MP;
 
    public int Cost;
 
    // так же осуществляет посредническую деятельность для доступу к другим компонентам, таким как
    protected UnitView _view;
    protected UnitMotor _motor;
    // так же тут можно указать принадлежность фракции, и прочие общие параметры
    
    // через свойства, потому как GetComponent операция затратная
    public UnitView View {
        get
        {
            if (_view == null) _view = GetComponent<UnitView>();
            return _view;
        }
    }
 
    public UnitMotor Motor
    {
        get
        {
            if (_motor == null) _motor = GetComponent<UnitMotor>();
            return _motor;
        }
    }
 
    // тaкже может содержать методы инициализации
    public void Initialie()
    {
        // ... код
    }
 
    // логики смерти
    public void Kill()
    {
        // логика смерти, начисление очков и тд
    }
 
    // методы урона и лечения обычно унифицируются в один метод
    public void AdjustHealth(float val)
    {
        // здесь проверка не ниже ли нуля и не больше ли допустимого предела
        HP += val;
    }
 
    // так эе мана
    public void AdjustMana(float val)
    {
        // здесь проверка не ниже ли нуля и не больше ли допустимого предела
        MP += val;
    }
}
класс UnitMotor отвечает исключительно за передвижение и вращение, реализация зависит от логики игры.
класс UnitView отвечает за отображение юнита, анимации, кружок подсветки, уровень хп и прочее, зависит от вышеперечисленных Unit и UnitMotor, но они не зависят от него. Как-то так это делается, и при необходимости, допустим, расширить функционал движения, просто наследуемся от необходимой нам базы. У нас в проекте получается что-то вроде этого
Кликните здесь для просмотра всего текста
1
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
09.10.2014, 00:44  [ТС] 13
int_array, ААААА я поняла !!!! я вас просто расцеловать готова))) Огромное вам спасибо, за такой развернутый, понятный ответ!!!
0
52 / 52 / 7
Регистрация: 13.10.2012
Сообщений: 180
09.10.2014, 01:09 14
Цитата Сообщение от Lina208 Посмотреть сообщение
int_array, ААААА я поняла !!!! я вас просто расцеловать готова))) Огромное вам спасибо, за такой развернутый, понятный ответ!!!
жена неправильно поймет, а вообще не за что, на то он и форум, я сам тут когда-то учился =)
0
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 8
09.10.2014, 12:56  [ТС] 15
Просто у меня такой ступор был!! жена - это святое!
0
09.10.2014, 12:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2014, 12:56
Помогаю со студенческими работами здесь

Учимся работать с WebBrowser
Всем привет! Совсем недавно начала изучать VB.NET. Советовали начать с изучения VB6, т.к. он...

Учимся запоминать скучную инфу
Как известно наш мозг наиболее легко запоминает яркую и эмоциональную информацию, картинку,...

Qt: Учимся вместе. Делимся опытом.
Сейчас я пытаюсь осваивать Qt. Я плохо знаю C++ и Qt в частности... поэтому часто бывают моменты,...

Учимся читать из файла то что нужно
В прикрепленной картинке есть скрин файлика истории который делает сервер. у меня работает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru