2015-04-29 2 views
0

Мне нужно переместить мой целевой объект в мировом пространстве относительно направления, на котором обращена основная камера, но только на оси z & и относительно моего игрока на ось y.Как я могу сделать это движение относительно направления моей камеры

Любые рекомендации приветствуются.

public class test : MonoBehaviour { 

public string raise = "Raise"; 
public string lower = "Lower"; 
public string left = "Left"; 
public string right = "Right"; 
public string closer = "Closer"; 
public string further = "Further"; 

public GameObject target; 


private float xPos; 
private float yPos; 
private float zPos; 


// Use this for initialization 
void Start() { 


    xPos = target.transform.position.x; 
    yPos = target.transform.position.y; 
    zPos = target.transform.position.z; 

} 

void FixedUpdate() { 

    Vector3 currPos = target.transform.position; 
    Vector3 nextPos = new Vector3 (xPos, yPos, zPos); 

    target.GetComponent <Rigidbody>().velocity = (nextPos - currPos) * 10; 

    if (Input.GetButton (raise)) { 
     print ("Moving Up"); 
     yPos = yPos + 0.05f; 
    } 
    if (Input.GetButton (lower)) { 
     print ("Moving Down"); 
     yPos = yPos - 0.05f; 
    } 
    if (Input.GetButton (left)) { 
     print ("Moving Left"); 
     xPos = xPos - 0.05f; 
    } 
    if (Input.GetButton (right)) { 
     print ("Moving Right"); 
     xPos = xPos + 0.05f; 
    } 
    if (Input.GetButton (closer)) { 
     print ("Moving Closer"); 
     zPos = zPos - 0.05f; 
    } 
    if (Input.GetButton (further)) { 
     print ("Moving Further"); 
     zPos = zPos + 0.05f; 
    } 
} 

ответ

2

Вы можете получить направление камеры, как это:

var camDir = Camera.main.transform.forward; 

Вы только хотите, х/у компонента, поэтому мы будем перенормировка этого вектора:

camDir.y = 0; 
camDir.Normalized(); 

Это передний вектор. Потому что это эффективно 2D вектор сейчас, мы можем получить вектор правой руки кулачка легко:

var camRight = new Vector3(camDir.z, 0f, -camDir.x); 

Я собираюсь Assum вверх направление вашего игрока просто вверх по оси у. Если это по-другому, к югу в этом векторе:

var playerUp = Vector3.up; 

Теперь в вашей выборке вы делаете ручную интеграцию, а затем передают его в жесткую систему тела, чтобы сделать интеграцию снова. Давайте непосредственно займемся собственной скоростью:

var newVel = Vector3.zero; 
if (/*left*/) newVel -= camRight * 0.05; 
if (/*right*/) newVel += camRight * 0.05; 
if (/*closer*/) newVel -= camDir * 0.05; 
if (/*farter*/) newVel += camDir * 0.05; 
if (/*raise*/) newVel += playerUp * 0.05; 
if (/*lower*/) newVel -= playerUp * 0.05; 

Измените это 0.05, если вы хотите двигаться быстрее или медленнее. Здесь вы можете сделать много вещей, чтобы элементы управления выглядели очень красивыми, например, иметь небольшую мертвую зону или напрямую подавать аналоговый вход, а не кнопки.

Тогда, наконец, совершить что в твердое тело:

target.GetComponent<Rigidbody>().velocity = newVel; 
+0

Спасибо за большой ответ tenpn, что действительно помогает мне. , но теперь, когда я отпускаю кнопку подъема, высота сбрасывается. Так я иду currentPos - newVel? – user1919580

+0

Мне нужно больше деталей. Вы начинаете на полу, поднимаете удар, и что происходит? Что вы хотите? – tenpn

+0

Хорошо, я вижу, это для системы телекинеза, поэтому, когда я нажимаю кнопку объекта объекта, она должна установить высоту объекта с земли и оставаться в этом месте, когда я отпущу кнопку. – user1919580