using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq;
public class MyPlayerShoot : MonoBehaviour { public GameObject bulletPrefab;//префаб патрона public float bulletSpeed = 30;//скорость патрона public float shootPause = 1;//таймер private float timeLastShoot = 0;//таймер public float shootRadius = 10;//радиус стрельбы private GameObject currentTarget;
// Use this for initialization void Start () {
}
// Update is called once per frame void Update () { if (Input.GetMouseButtonDown (1)) { currentTarget = findTargets();//ближайший моб transform.LookAt(currentTarget.transform.position);//поворот к мобу float distance = Vector3.Distance (transform.position, currentTarget.transform.position); if(distance> shootRadius){ Debug.Log("Моб слишком далеко"); }else{ if(Time.time> timeLastShoot + shootPause){ Vector3 shoot = currentTarget.transform.position - transform.position; Vector3 shootNormal = shoot.normalized; GameObject newBullet = (GameObject) Instantiate(bulletPrefab,transform.position + Vector3.one , Quaternion.identity); Rigidbody newBulletRigidbody = newBullet.GetComponent<Rigidbody>(); newBulletRigidbody.AddForce(shootNormal * bulletSpeed, ForceMode.VelocityChange); timeLastShoot = Time.time;
и действительно шар полетел как надо.... немного косячно когда целевой моб за спиной у персонажа(перс пока не поворачивается к цели) шар бьется об коллайдер перса и летит куда попало... Два дня я колдовал с этим выстрелом а оказалось что коллайдер беспощадная ты ****....убейте меня :)) seaman спасибо за помощ
Смотрим AddForce. Что там первым параметром? А Вы что передаете?
Ну... первый параметр вектор,я так думал что это координаты либо цели либо персонажа.Пробовал оба варианта...не то... Теперь думаю вот что это координаты точки от куда будет направлена сила...ну эт ток мои догадки.. А про линейную алгебру взял на заметку, на работе почитаю. Спасибо
у меня ещё как я понял направление патрона кривое в скрипте playerShoot. Патрон летит куда полпало, а иногда выдает что растояние слишком велико до цели...хотя я ставил радиус 500м... Как сделать что бы патрон двигался к позиции моба?
Здравствуйте.Тут такая борода... Читал про плюсы полиморфизма...и вот при помощи его и наследования пытаюсь сделать схему поведения мобов, персонажа.. Проблема в том что в скрипте патрона блок отвечающий за нанесения урона при обнаружении коллайдера пропускает...и получается так что патрон создается и сразу же удаляется... Unity ошибок не видет, я тоже смотрел смотрел вроде всё логично и правильно... Может кто подскажет где бида...? Скрипты ниже на мобе висит:
Код
using UnityEngine; using System.Collections;
public class MobBehavior : MyBehavior { public MyHp thisHp; private bool isLive = true; // Use this for initialization void Start () { thisHp = GetComponent<MyHp> (); }
public override void SetDamage(float damage){ if (isLive) { if(thisHp.SetDamage(damage)){ //моб жив ничего не делаем }else{ Debug.Log("Моб умер"); } } } }
Код
using UnityEngine; using System.Collections;
public class MobHp : MyHp { public float fullHp = 100; public float currentHp;
// Use this for initialization void Start () { currentHp = fullHp; }
public class MyPlayerShoot : MonoBehaviour { public GameObject bulletPrefab; public float bulletSpeed = 30; public float shootPause = 1; private float timeLastShoot = 0; public float shootRadius = 10; private Transform mobTransform; // Use this for initialization void Start () {
}
// Update is called once per frame void Update () { if (Input.GetMouseButtonDown (1)) { lookTarget(); float distance = Vector3.Distance (transform.position, mobTransform.position); if(distance> shootRadius){ Debug.Log("Моб слишком далеко"); }else{ if(Time.time> timeLastShoot + shootPause){ GameObject newBullet = (GameObject) Instantiate(bulletPrefab, transform.position + transform.forward, Quaternion.identity); Rigidbody newBulletRigidbody = newBullet.GetComponent<Rigidbody>(); newBulletRigidbody.AddForce(mobTransform.position * bulletSpeed, ForceMode.VelocityChange); timeLastShoot = Time.time;
Здравствуйте. Тут такая борода... Анимация бега на персонаже запускается при запуске сцены в игровой режим, после первого перемещения персонажа всё работает как надо. настройки анимации
аниматор
скрипт
Код
using UnityEngine; using System.Collections;
public class PlayerMove : MonoBehaviour { Animator animator; NavMeshAgent agent; private Vector3 distTest;
// Use this for initialization void Start () { agent = gameObject.GetComponent<NavMeshAgent> (); animator = gameObject.GetComponent<Animator> ();
}
// Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 300f)){ agent.destination = hit.point; distTest = hit.point; } } float dist = Vector3.Distance (transform.position, distTest); Debug.Log (dist); if (dist > 0.0f) animator.SetFloat ("Speed", 0.2f); if (dist <= 1f) animator.SetFloat ("Speed", 0.0f); } }
Сообщение отредактировал ivan2009 - Суббота, 25 Июля 2015, 19:07
Nav Mesh Agent доступень и free версии. Туториалы смотри в мануале, там четко написано и на русском ссылка
Да смотрел уже, вот только что ещё раз пересмотрел....там все описание на англ.... процентов пять из nav mesh agent переведено...
вот не могу понять что ему не нравится....всё как в справочнике
Код
using UnityEngine;
public class MyNavMeshAgent : MonoBehaviour { NavMeshAgent agent; // Use this for initialization void Start () { agent = GetComponent<NavMeshAgent> (); }
// Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { RaycastHit hit; if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,100)){ agent.destination = hit.point; } } } }
а юнити ругается... "SetDestination" can only be called on an active agent that has been placed on a NavMesh. UnityEngine.NavMeshAgent:set_destination(Vector3) MyNavMeshAgent:Update() (at Assets/myScript/MyNavMeshAgent.cs:16)
на сколько я понял не установлено место назначения....так вроде ж hit.poin самое что ни на есть место назначения да и тип данных тот что надо... разобрался.....написать скрипт было мало...там в нивигейшн надо было ещё зону разметить... разметил и меня кубик начал сам по себе что бешеный летать по терейну...потом методом тыка нашел что в ригид боди надо поставить галку в is kinematic ... хотелось бы почитать про все прелести меш агента...если кого есть инфа на русском поделитесь пожалуйста
Сообщение отредактировал ivan2009 - Четверг, 16 Июля 2015, 20:17
Здравствуйте. Подскажите Nav Mesh Agent работает только в pro версии или в обычной тоже(у меня unity 5.1.1). И может кто объяснить как ним работать или может кто знает какой то сайт, туториал на русском раскрывающий суть этого компонента?
Ну во первых - вынесите проверку луча из if(walk) Во вторых выключайте walk, когда расстояние до цели меньше заданного:
Ну вроде бы всё сделал...но результат остался тот же...кубик по оси Z(дрожит) при остановке, не пойму почему чем выше я ставлю скорость тем больше эффект дрожания ...И всё равно если freez rotation убрать то кубит вертится вокруг своей оси...
Вот исходник после поправок :
Код
using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { public float speed = 5f; Ray ray; RaycastHit hit; bool walk = true ; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { controller = (CharacterController)gameObject.GetComponent<CharacterController>();
} // Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { ray = Camera.main.ScreenPointToRay (Input.mousePosition); Physics.Raycast (ray, out hit, 500.0f); TargetToMove = hit.point; walk = true; } if (walk) { move (); } }
Ещё такой вопросик Сделал вращение дочернего объекта вокруг родителя... вращается горизонтально, а как сделать к примеру что бы вращался он по вертикальной оси, как управлять направлением вращения?
Код
using UnityEngine; using System.Collections;
public class Gravity : MonoBehaviour { public Transform target;
// Update is called once per frame void Update () { Vector3 relativePos = (target.position + new Vector3(0, 1, 0)) - transform.position; Quaternion rotation = Quaternion.LookRotation (relativePos); Quaternion current = transform.localRotation; transform.localRotation = Quaternion.Slerp (current , rotation, Time.deltaTime); transform.Translate (0, 0 , 5 * Time.deltaTime);
} }
Сообщение отредактировал ivan2009 - Воскресенье, 12 Июля 2015, 21:37
Спасибо. У куба при остановке постоянно меняется координата Z (transfotm.position), там тысячные доли циклически(по возрастанию) происходит это быстро(а чем больше я ставлю скорость тем больше это дрожание) и получается что кубик дрожит. И ещё куб постоянно меняет координаты всех осей rotation(вокруг своей оси),я то поставил freezRotation в Rigidbody, но хотелось бы и самому его покрутить... исходник
Код
using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { public float speed = 5f; Ray ray; RaycastHit hit; float mag; bool walk = true ; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { controller = (CharacterController)gameObject.GetComponent<CharacterController>();
} // Update is called once per frame void Update () { if (walk) { if (Input.GetMouseButtonDown (0)) { ray = Camera.main.ScreenPointToRay (Input.mousePosition); if (Physics.Raycast (ray, out hit, 500.0f)) { TargetToMove = hit.point; walk = true; } } move (); } }
получилось, радостно. на всяк случай скину код может найдутся ещё такие как я...
Код
using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { // private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag; bool walk =true ; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { player = (GameObject)this.gameObject; controller = (CharacterController)gameObject.GetComponent(typeof(CharacterController)); //playerPos = player.transform.position;
}
// Update is called once per frame void Update () {
if (walk) {
//mousePos = Input.mousePosition; if(Input.GetMouseButton(0)){ ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ TargetToMove = hit.point; walk = true;
При движении кубик калашматило по всем осям пока в RigidBody freez rotation не поставил. Очень доволен что получилось, сижу гоняю кубик по платформе... Спасибо большое за помощь
Я заметил что по мере приближения объекта к указанной точке он замедляется и чем ближе тем медленней передвигается. Как сделать ему постоянную скорость вне зависимости от оставшегося расстояния?
Сообщение отредактировал ivan2009 - Пятница, 10 Июля 2015, 00:29
Только вот куб не двигается, переменная TargetToMove отображает координаты, и ругается что вроде как controller постоянно с дэфолтовым значением(null) точно не умерен, в англ слабоват... вот что юнити пишет Assets/MyScript/myMove.cs(14,29): warning CS0649: Field `myMove.controller' is never assigned to, and will always have its default value `null'
Здравствуйте. Начал изучать юнити совсем недавно,так что если кому то мои вопросы покажутся нубскими, уж извиняйте... Хочу сделать контроллер перемещения объекта с помощью мышки,самый простой, что бы кубик передвигался(пока без анимации ) по платформе по клику ЛКМ в указанное место. Шастал по просторам гугла, читал описания, даже нашел готовый скрипт(правда на устаревший юнити, у меня 5.1.1). В общем все что смог пока родить
Код
using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag;
// Use this for initialization void Start () { player = (GameObject)this.gameObject; //playerPos = player.transform.position;
}
// Update is called once per frame void Update () { mousePos = Input.mousePosition; if (Input.GetMouseButton (0)) { ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ Debug.Log ("MOUSE POS -> " + mousePos); //mag = (transform.position - hit.point).magnitude; //player.transform.position = Vector3.MoveTowards(player.transform.position, hit.point, mag); //player.transform.position = new Vector3(hit.point.x, transform.position.y , hit.point.z); //player.transform.position += hit.point*speed*Time.deltaTime; Debug.Log("NEW PLAYER POS -> " + player.transform.position);
} }
} }
И вот какие незадачи... если подключаю в первом варианте mag = (transform.position - hit.point).magnitude; player.transform.position = Vector3.MoveTowards(player.transform.position, hit.point, mag); - то кубик мгновенно появляется в точке hit.point и начинает взлетать по оси У. во втором player.transform.position = new Vector3(hit.point.x, transform.position.y , hit.point.z); - то кубик мгновенно появляется в точке hit.point, если зажать ЛКМ и подвигать мышкой, то дублирует координаты курсора. в третьем player.transform.position += hit.point*speed*Time.deltaTime; - то кубик движется в hit.point пока зажата кнопка ЛКМ, а иногда движется и не туда А мне бы хотелось сделать так что при нажатии ЛКМ(одном клике) кубик с определенной скоростью передвигался в точку hit.point, но пока что видать не хватает в голове нужных знаний. Так что буду очень признателен если кто то поможет.