我正在使用Unity中的下一个脚本来移动玩家通过等轴测场景。问题是,当我靠墙跳跃时,玩家会被卡在墙上,每次我按下跳跃键,它就会跟着跳跃。
这是脚本:
#pragma strict
var speed = 2.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
var smoothSpeed = 10.0;
var smoothDirection = 10.0;
private var moveDirection = Vector3.zero;
private var verticalSpeed = 0.0;
private var moveSpeed = 2.0;
private var grounded : boolean = false;
private var jumping : boolean = false;
private var targetAngle = 0.0;
var anim : Animator;
var dontJump = "false";
// Require a character controller to be attached to the same game object
@script RequireComponent(CharacterController)
function Awake ()
{
moveDirection = transform.TransformDirection(Vector3.forward);
}
function UpdateSmoothedMovementDirection ()
{
var cameraTransform = Camera.main.transform;
// Forward vector relative to the camera along the x-z plane
var forward = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0;
forward = forward.normalized;
// Right vector relative to the camera
// Always orthogonal to the forward vector
var right = Vector3(forward.z, 0, -forward.x);
// Target direction relative to the camera
var targetDirection = Input.GetAxis("Horizontal") * right + Input.GetAxis("Vertical") * forward;
// We store speed and direction seperately,
// so that when the character stands still we still have a valid forward direction
// moveDirection is always normalized, and we only update it if there is user input.
if (targetDirection != Vector3.zero)
{
moveDirection = Vector3.Lerp(moveDirection, targetDirection, smoothDirection * Time.deltaTime);
moveDirection = moveDirection.normalized;
if(grounded){
anim.Play("walk",0);
}
}else{
if(grounded){
anim.StopPlayback();
anim.Play("idle2",0);
}
}
// Smooth the speed based on the current target direction
var curSmooth = smoothSpeed * Time.deltaTime;
// When in air we accelerate slower
if (!grounded)
{
curSmooth *= 0.1;
}
moveSpeed = Mathf.Lerp(moveSpeed, targetDirection.magnitude * speed, curSmooth);
}
function Start(){
anim = GetComponent("Animator") as Animator;
}
function Update() {
UpdateSmoothedMovementDirection();
if (grounded) {
verticalSpeed = 0.0;
// Jump
if (grounded && Input.GetButton ("Jump")) {
verticalSpeed = jumpSpeed;
jumping = true;
var move : float = Input.GetAxis ("Vertical");
anim.Play("jump",0);
SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);
}
}
// Apply gravity
verticalSpeed -= gravity * Time.deltaTime;
var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0);
movement *= Time.deltaTime;
// Move the controller
var controller : CharacterController = GetComponent(CharacterController);
var flags = controller.Move(movement);
grounded = (flags && CollisionFlags.CollidedBelow) != 0;
// Set rotation to the move direction
transform.rotation = Quaternion.LookRotation(moveDirection);
// We are in jump mode but just became grounded
if (grounded && jumping)
{
jumping = false;
SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);
}
}
function GetSpeed () {
return moveSpeed;
}
function IsJumping () {
return jumping;
}
function GetDirection () {
return moveDirection;
}
玩家是一个使用刚体和胶囊碰撞器的模型。
最后我解决了它。我已经声明了这个变量:
var character : CharacterController;
我已经替换了这个条件:
if (grounded)
其中一个:
if (character.isGrounded)
在开始功能中,我添加了:
character = GetComponent( CharacterController );
仅此而已。