我试图在团结中开发3D无尽的亚军游戏。我面临的问题是跳跃。如何应用跳跃到无尽的跑步者?我一直在互联网上搜索和浏览,没有运气。我确实找到了一些代码,但是当我尝试应用它们时,它们并没有起作用。另外如何调整角色控制器以使用动画?真的很感激帮助。
这是playerMotor.cs代码。
private Vector3 moveVector;
private float verticalVelocity = 0.0f;
private float gravity = 12.0f;
private float jumpPower = 15.0f;
private bool jump;
private float animationDuration = 3.0f;
private float startTime;
private Animator anim;
private CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
anim = GetComponent<Animator>();
startTime = Time.time;
}
void Update()
{
if (Time.time - startTime < animationDuration)
{
controller.Move(Vector3.forward * speed * Time.deltaTime);
return;
}
moveVector = Vector3.zero;
if (controller.isGrounded)
{
verticalVelocity = -0.5f;
if (Input.GetButton("Jump"))
{
verticalVelocity = jumpPower;
anim.SetBool("Jump", true);
}
//anim.SetBool("Jump", false);
}
else
{
verticalVelocity -= gravity * Time.deltaTime;
}
// X - Left and Right
moveVector.x = Input.GetAxisRaw("Horizontal") * speed;
anim.SetFloat("Turn", moveVector.x);
if (Input.GetMouseButton(0))
{
//Are we holding touch on the right side?
if (Input.mousePosition.x > Screen.width / 2)
{
moveVector.x = speed;
}
else
{
moveVector.x = -speed;
}
}
//// Y - Up and Down
//if (Input.GetButtonDown("Jump"))
//{
// moveVector.y = verticalVelocity;
//}
// Z - Forward and Backward
moveVector.z = speed;
controller.Move(moveVector * Time.deltaTime);
}
我用来实现的代码如下所示。
function PlayerController(){
var controller : CharacterController = GetComponent(CharacterController);
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (controller.isGrounded) {
vSpeed = -1;
if (Input.GetButtonDown ("Jump")) {
vSpeed = jumpSpeed;
}
}
vSpeed -= gravity * Time.deltaTime;
moveDirection.y = vSpeed;
controller.Move(moveDirection * Time.deltaTime);
}
我已经为正常的RPG角色应用了跳跃,但这个比我想象的要难。
答案 0 :(得分:1)
从您的评论看来,您的实际问题似乎是&#34; controller.isGrounded&#34;从不打算,对吗?
我描述了与动画相关的评论(anim.SetBool("Jump", false);
)中的第一个问题。
第二个问题来自您的PlayerController
代码。
你&#34;重置&#34;你刚刚跳过的框架之后设置vSpeed = -1;
的跳跃。所以从技术上来说,引擎甚至没有时间对跳跃做出反应,因为下一帧的角色很难被拉回地面(通过你实施的&#34;反跳&#34; :)。
我建议的是,从CharacterController.Move获取示例代码,就像您在应用更改之前所做的那样,但这次不能改变它!
只需将代码段复制粘贴到您的应用中并进行测试即可。在您按原样运行之后,再次,在没有任何代码更改的情况下,添加所需的自定义项,逐个并在每次更改时引入更改(bug)。
我还建议你在编码时开始使用Debug.Log()
,这样你就可以过滤掉现在的问题,就像你和#39;看看代码中发生了什么&#34;动态&#34;,当你进行游戏测试时(.Log变量值带注释,如果&#34;分支&#34;当他们勾选时,计算值,调用重要的功能 - 如.Move() - 等)。
我希望这有帮助!干杯!
答案 1 :(得分:0)
我终于找到了问题的答案。感谢马克给你的建议,这对我帮助很大。
所以这就是我做的跳跃和跳跃动画。另请注意,我发布了正确而不是整个代码的内容,因为我在脚本的其余部分中未发现任何其他错误。
moveVector = Vector3.zero;
if (controller.isGrounded) //Check whether are we ground
{
verticalVelocity = -0.5f; //Just to make sure that we are ground
if (Input.GetButton("Jump"))
{
verticalVelocity = 10f; //Basically this is the Jump power to Player
anim.SetBool("Jump", true); //Jump animation to true
}
}
else
{
verticalVelocity -= gravity * speed * Time.deltaTime; //Apply gravity
anim.SetBool("Jump", false); //Set jump animation to false to stop looping continuously
}
//... the rest
这是我自己的代码。谢谢你帮助Mark。也欢呼你。