Я написал сценарий для перемещения объекта с помощью луча в позиции на местности, однако я не могу, чтобы жизнь меня казалась гладкой. Я пробовал всевозможные вещи, пытаясь понять это (как вы, вероятно, можете сказать по количеству прокомментированного кода ниже); отключая различные переменные жесткости, однако безрезультатно.Smooth raycast positioning
Один из подходов, с помощью которых (вида) был отключен коллайдер, прикрепленный к объекту, однако это приводит к непреднамеренному погружению объекта под ландшафт.
Может кто-нибудь, пожалуйста, посоветуйте мне, как наилучшим образом подойти к этому? Я чувствую, что это должно быть очень просто, но я слишком усложняю это.
//Move
if (Input.GetKey(KeyCode.E)) {
// if (Input.GetKeyDown(KeyCode.E))
// {
// modObj.GetComponent(BoxCollider).enabled = false;
initPos = modObj.transform.position;
var initRotation = modObj.transform.rotation;
// }
//
// modObj.GetComponent(Rigidbody).isKinematic = true;
// modObj.GetComponent(Rigidbody).useGravity = false;
moveObject(modObj, initPos, initRotation);
} else {
// modObj.GetComponent(BoxCollider).enabled = true;
// modObj.GetComponent(Rigidbody).isKinematic = false;
// modObj.GetComponent(Rigidbody).useGravity = true;
}
function moveObject(modObj: GameObject, initPos: Vector3, initRotation: Quaternion) {
//Debug.Log("Moving Object");
var hit: RaycastHit;
var foundHit: boolean = false;
foundHit = Physics.Raycast(transform.position, transform.forward, hit);
//Debug.DrawRay(transform.position, transform.forward, Color.blue);
if (foundHit && hit.transform.tag == "Terrain") {
modifyObjGUIscript.activateMoveDisplay(initPos, hit.point);
// var meshHalfHeight = modObj.GetComponent.<MeshRenderer>().bounds.size.y /2; //helps account for large and small objects
modObj.transform.position = hit.point; //***method 01***
// modObj.transform.position = Vector3.Lerp(initPos, hit.point, speed); //***method 02***
// modObj.transform.position = Vector3.SmoothDamp(initPos, hit.point, velocity, smoothTime); //***method 02***
// modObj.transform.position.y = modObj.transform.position.y + meshHalfHeight + hoverHeight;
modObj.transform.rotation = initRotation;
}
}
Право на. Также обратите внимание, что очень часто вы делаете это: у вас есть новый независимый маркер (т. Е. Пустой GameObject), называемый «Tracker». Но маленький белый куб на нем для целей развития, чтобы вы могли его увидеть. Поместите сценарий Джорела на Tracker (НЕ НА ВАШ АКТУАЛЬНЫЙ САМОЛЕТ). Сделать пользователя на самом деле управляющим и т. Д., Tracker. Затем, ваш самолет действительно * следит за Tracker везде *. Таким образом, вы можете * сгладить движение на Y * для самолета; часто бывает проще и логично это делать. – Fattie
@joreldraw жаль должно быть яснее в моем сообщении: функция 'moveObject()' вызывается из 'Input.GetKey (KeyCode.E)' внутри 'FixedUpdate()'; это соответствует тому, что вы говорите? Я также изменил позиционирование с помощью преобразования объекта на его жесткое тело: 'var movRb = modObj.GetComponent. (); ' ' movRb.position = Vector3.Lerp (initPos, hit.point, speed); ' в соответствии с некоторой другой обратной связью, которую я получил. Это, безусловно, помогло, но не разрешило проблему. Любая дополнительная обратная связь будет высоко оценена. –
попытайтесь вызвать сопрограмму coroutine с условием while, я редактирую сопрограмму для этого. – joreldraw