2017-01-10 18 views
3

Я хочу ограничить движение игроков в диапазонах сфер, схематическая диаграмма показана ниже, если движение игрока выходит за пределы диапазона, а затем ограничивает диапазон до максимального радиуса шара.Установить границу игроков в пределах сферы

Как я могу написать код C# для его реализации, как это?

enter image description here

это мой текущий шаг:

  1. создать 3D сфера

  2. создать C# код Append к сфере объект

Мой код до сих пор:

+0

Решена ли ваша проблема? Если это так, пожалуйста, подумайте о том, чтобы выбрать ответ в качестве ответа. – Kardux

ответ

3

Я не знаю, как вы рассчитываете позицию своего игрока, но прежде чем назначать новую позицию игроку, который вы должны проверить, и посмотреть, подходит ли движение к , проверяя новое расстояние позиции от центра сферы

//so calculate your player`s position 
//before moving it then assign it to a variable named NewPosition 
//then we check and see if we can make this move then we make it 
//this way you don't have to make your player suddenly stop or move it 
//back to the bounds manually   

if(Vector3.Distance(sphereGameObject.transform.position, NewPosition)< radius) 
{ 
//player is in bounds and clear to move 
SetThePlayerNewPosition(); 
} 
+0

Хорошо, я попробую, большое спасибо за вашу помощь. – user3177358

1

Что @Milad предложил правильно, но и включают в себя тот факт, вы не сможете «слайд» на границе сферы, если ваш вектор движения даже немного выходит за пределы сферы:

Sphere vector explanation

(извините за паршивые графические навыки ...)

Что вы можете сделать, если вы хотите, чтобы иметь возможность «слайд» на сфере внутренней поверхности получает угол, образованным между позицией игрока и X вектор, а затем применить этот угол с:

public Transform player; 
public float sphereRadius; 

void LateUpdate() 
{ 
    Vector3 pos = player.position; 
    float angle = Mathf.Atan2(pos.y, pos.x); 
    float distance = Mathf.Clamp(pos.magnitude, 0.0f, sphereRadius); 
    pos.x = Mathf.Cos(angle) * distance; 
    pos.y = Mathf.Sin(angle) * distance; 
    player.position = pos; 
} 

Просто убедитесь, что с помощью этого не будет обратным эффект сценария движения игрока (именно поэтому я положил его в LateUpdate() в моем примере).

+0

Привет, Kardux: Большое спасибо за вашу помощь, он отлично работает. – user3177358