У меня 2 вопроса:
Rigidbody.velocity
, AddForce
она летит по прямой. Как мне сделать так, чтобы она полетела как "по дуге" по кругу в цель, чтобы летела не прямо, а долетела прямо вверх, потом опустилась в точку?
Артиллерия. Пытался сложить 2 вектора: Vector3.forward
+ Vector3.up
, не выходит, летит по диагонали и не падает.Вот код:
using UnityEngine;
using System.Collections;
public class Point : MonoBehaviour {
private Transform point;
public Rigidbody force;
public GameObject effect;
public Transform to;
void Start () {
force.transform.position = transform.position;
}
void Update () {
Vector3 dir = (to.transform.position - force.transform.position + transform.up);
force.AddForce (dir);
}
}
Вот код:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Tower : MonoBehaviour {
public Transform spawn;
public Rigidbody bullet;
public float delay = 0.5f;
private List<GameObject> target;
private GameObject unit;
private bool can_shoot = true;
private float shoot_timer = 0.0f;
private float distance;
void Attack() {
target = new List<GameObject> ();
target.AddRange(GameObject.FindGameObjectsWithTag("Unit"));
foreach (GameObject t in target) {
float distance = Vector3.Distance (transform.position, t.transform.position);
if (distance < 25) {
Vector3 dir = t.transform.position - transform.position;
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), Time.deltaTime * 15.0f);
}
}
Ray ray = new Ray (spawn.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast (ray, out hit)) {
if (hit.collider.tag == "Unit") {
hit.collider.gameObject.GetComponent<Unit> ().health -= 1.0f;
}
}
Rigidbody go = (Rigidbody)Instantiate (bullet, spawn.position, Quaternion.identity);
go.velocity = transform.forward * 16.0f;
can_shoot = false;
}
void Update () {
if (!can_shoot) {
shoot_timer += Time.deltaTime;
if (shoot_timer >= delay) {
shoot_timer = 0.0f;
can_shoot = true;
}
}
if (can_shoot) {
Attack ();
}
}
}
Жду ваших ответов.
По 2ому вопросу. Раздели функцию атаки на поиск целей и конкретно атаку текущей. Ищешь цель. Нашел запомнил, проверяешь 3 условия цель не null, цель жива и цель находится в радиусе атаки, если все условия выполнились то вызывает атаку. Иначе снова ищем цель
Решил проблему сам. Вот код:
bool nav = true;
if (nav == true) {
for (int i = 0; i < target.Count; i++) {
float distance = Vector3.Distance (transform.position, target [i].transform.position);
if (distance < 25 && nav == true) {
current = target [i];
nav = false;
}
}
}
Vector3 dir = current.transform.position - transform.position;
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.LookRotation (dir), Time.deltaTime * 15.0f);
Причина: когда раньше пытался реализовать такую логику, неправильно использовал логическую переменную.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Можно ли узнать количество кликов или нажатий мыши по canvas в JS? Реально ли это?
Пока еще не силен в jsНаписал работающий код, но мне кажется что может быть его можно как то сократить