Игрок перемещается по поверхности как и требуется, но вот заставить его смотреть на мышку не получается. Точнее в редакторе все работает как надо. Но когда делаю билд игрок отказывается поворачиваться.
Если вращать игрока с клавиатуры то все нормально, но такой вариант не подходит (ниже в скрипте оставил закомментированный пример). Нужен игрок с камерой от первого лица.
Скрипт игрока:
Синтаксис:
Используется javascript
var speed = 10.0;
var gravity = 10.0;
var canJump = true;
var jumpHeight = 2.0;
private var grounded = false;
var rotationSpeed = 100.0;
var sensitivityX = 15;
private var desiredUp = Vector3.zero;
var groundLayers : LayerMask;
@script RequireComponent(Rigidbody, CapsuleCollider)
function Awake ()
{
rigidbody.freezeRotation = true;
rigidbody.useGravity = false;
}
function FixedUpdate ()
{
AdjustToGravity();
if (grounded)
{
mouseX = Input.GetAxis("Mouse X")* sensitivityX;
transform.rotation *= Quaternion.Euler(0, mouseX, 0);
/*
horizontal = Input.GetAxis("Horizontal")*rotationSpeed;
if(horizontal != 0)
{
var RotationOvertime = Quaternion.Euler(0,horizontal*5*Time.deltaTime,0);
transform.rotation *= RotationOvertime;
}
*/
// Calculate how fast we should be moving
var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
var velocity = rigidbody.velocity;
var velocityChange = (targetVelocity - velocity);
// clamp acceleration vector to unit sphere
if (velocityChange.sqrMagnitude > 1)
velocityChange.Normalize();
rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
// Jump
if (canJump && Input.GetButton("Jump"))
{
rigidbody.velocity = velocity + transform.up * Mathf.Sqrt(2 * jumpHeight * gravity);
}
}
// We apply gravity manually for more tuning control
rigidbody.AddForce(desiredUp * -gravity * rigidbody.mass);
grounded = false;
}
function OnCollisionStay ()
{
grounded = true;
}
function AdjustToGravity() {
var origLayer = gameObject.layer;
gameObject.layer = 2;
var currentUp = transform.up;
var damping = Mathf.Clamp01(Time.deltaTime*5);
var hit : RaycastHit;
for (var i=0; i<8; i++) {
var rayStart =
transform.position
+ transform.up
+ Quaternion.AngleAxis(360*i/8.0, transform.up)
* (transform.right*0.5);
Debug.DrawRay(rayStart, transform.up * -5, Color.red);
// Debug.Log(Physics.Raycast(rayStart, transform.up*-48, hit, 3.0, groundLayers));
if ( Physics.Raycast(rayStart, transform.up*-2, hit, 3.0, groundLayers.value)) {
desiredUp += hit.normal;
}
}
desiredUp = (currentUp+desiredUp).normalized;
var newUp = (currentUp+desiredUp*damping).normalized;
var angle = Vector3.Angle(currentUp,newUp);
if (angle>0.01) {
axis = Vector3.Cross(currentUp,newUp).normalized;
rot = Quaternion.AngleAxis(angle,axis);
transform.rotation = rot * transform.rotation;
}
gameObject.layer = origLayer;
}
var gravity = 10.0;
var canJump = true;
var jumpHeight = 2.0;
private var grounded = false;
var rotationSpeed = 100.0;
var sensitivityX = 15;
private var desiredUp = Vector3.zero;
var groundLayers : LayerMask;
@script RequireComponent(Rigidbody, CapsuleCollider)
function Awake ()
{
rigidbody.freezeRotation = true;
rigidbody.useGravity = false;
}
function FixedUpdate ()
{
AdjustToGravity();
if (grounded)
{
mouseX = Input.GetAxis("Mouse X")* sensitivityX;
transform.rotation *= Quaternion.Euler(0, mouseX, 0);
/*
horizontal = Input.GetAxis("Horizontal")*rotationSpeed;
if(horizontal != 0)
{
var RotationOvertime = Quaternion.Euler(0,horizontal*5*Time.deltaTime,0);
transform.rotation *= RotationOvertime;
}
*/
// Calculate how fast we should be moving
var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
var velocity = rigidbody.velocity;
var velocityChange = (targetVelocity - velocity);
// clamp acceleration vector to unit sphere
if (velocityChange.sqrMagnitude > 1)
velocityChange.Normalize();
rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
// Jump
if (canJump && Input.GetButton("Jump"))
{
rigidbody.velocity = velocity + transform.up * Mathf.Sqrt(2 * jumpHeight * gravity);
}
}
// We apply gravity manually for more tuning control
rigidbody.AddForce(desiredUp * -gravity * rigidbody.mass);
grounded = false;
}
function OnCollisionStay ()
{
grounded = true;
}
function AdjustToGravity() {
var origLayer = gameObject.layer;
gameObject.layer = 2;
var currentUp = transform.up;
var damping = Mathf.Clamp01(Time.deltaTime*5);
var hit : RaycastHit;
for (var i=0; i<8; i++) {
var rayStart =
transform.position
+ transform.up
+ Quaternion.AngleAxis(360*i/8.0, transform.up)
* (transform.right*0.5);
Debug.DrawRay(rayStart, transform.up * -5, Color.red);
// Debug.Log(Physics.Raycast(rayStart, transform.up*-48, hit, 3.0, groundLayers));
if ( Physics.Raycast(rayStart, transform.up*-2, hit, 3.0, groundLayers.value)) {
desiredUp += hit.normal;
}
}
desiredUp = (currentUp+desiredUp).normalized;
var newUp = (currentUp+desiredUp*damping).normalized;
var angle = Vector3.Angle(currentUp,newUp);
if (angle>0.01) {
axis = Vector3.Cross(currentUp,newUp).normalized;
rot = Quaternion.AngleAxis(angle,axis);
transform.rotation = rot * transform.rotation;
}
gameObject.layer = origLayer;
}
Ну а здесь package если у кого руки дойдут потестить