时间:2023-07-28 02:54:02 | 来源:网站运营
时间:2023-07-28 02:54:02 来源:网站运营
这是你永远抵达不到的真实——用Unity做一个JOJOJump:嗨大家好我是yumir。 public float smooth; // 平滑度 public Transform cameraFPTran; //人物活动时摄像机跟随位置 public Transform cameraStartTran; //摄像机初始位置 private GameObject player; // 目标 private Vector3 targetPosition; // 摄像机移动目标 private bool isStart = true; void Start() { player = GameObject.FindWithTag("Player"); cameraFPOffset = cameraFPTran.position - player.transform.position; //摄像机放在初始位置,置标志位为f jetSlider.SetActive(false); } void LateUpdate() { if (isStart) { CameraFollow(cameraFPOffset); } } void CameraFollow(Vector3 follow) { targetPosition = player.transform.position + follow; transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * smooth); transform.LookAt(player.transform); }
在实现跳跃之前我们需要让模型在游戏场景中往前跑,首先新建Boss的游戏物体,然后进行以下操作: private void FixedUpdate() { if (!isJump && playerRigdbody.velocity.z < speed) { playerRigdbody.AddForce(Vector3.forward * speed); } playerAnimator.SetFloat("Blend", playerRigdbody.velocity.z / speed); }
接下来就要实现跳跃功能了,跳跃有:起跳、空中、下落这三个状态,加上本身有一个奔跑状态,而起跳到空中这段动作是不需要条件转换的,我的动画状态机是这样搭建的。Physics.Raycast(transform.position + Vector3.up * 0.05f, -Vector3.up, out hit, 0.1f)
解决了Boss上天的问题我开始思考每一次跳跃之间的差别,整个游戏只有按下鼠标左键一个操作,但是每个阶段的操作都是不一样的,可以看出来最大的问题是最后一条需要出现反馈喷射进度的UI,而且是在起跳后一段时间才出现喷射进度条。if (isGround){ isJump = false; if (Input.GetMouseButtonDown(0) && playerTransform.position.z < 18.0f) { if (playerTransform.position.z > 14.5f && playerTransform.position.z < 15.5f)//最佳 { jumpSpeed *= 2; } SetPlayerAnima(PlayerStateType.Jump); playerRigdbody.AddForce((Vector3.up) * jumpSpeed, ForceMode.Impulse); jumpNum++; jumpTime = 0; isJump = true; } if (playerTransform.position.z >= 18.0f) { playerMove = PlayerDie; }}
第二跳第三跳大同小异,与第一跳不同的地方是第一跳用距离判断是否加倍,后面的跳跃则是用落地时间,所以当Boss落地之后就要开始计时,在起跳的时候将计时器清零。if (isGround){ jumpTime += Time.deltaTime; if (jumpTime > timing){ playerMove = PlayerDie; } else if (Input.GetMouseButtonDown(0) && jumpTime <= timing) { if (jumpTime <= bestTiming){ jumpSpeed *= 2; } Jump(); }}
需要注意的是如何控制动画的播放,当Boss快要落地的时候要切换为“Down”动画,也就是我需要知道他是否下坠,下坠时离地面多高,我通过记录Boss的Y轴数值并比较上一帧和当前帧的Y值大小来判断:if (lastPosY > playerTransform.position.y && playerTransform.position.y < 2){ SetPlayerAnima(PlayerStateType.Down);}lastPosY = playerTransform.position.y;
Boss的第三次起跳需要延迟调用,我是用协程来实现的,在协程中对委托进行新的赋值操作,并且解开对Boss刚体的旋转锁定,以及一系列该有的操作。IEnumerator Jet(){ yield return new WaitForSeconds(1); playerRigdbody.freezeRotation = false; GameManager.instance.jetSlider.SetActive(true); jetValue = jetTimes; playerMove = PlayerMove02;}
喷射进度条是我自己用PS做的,用了一个和游戏场景比较搭的配色,在场景中新建两个Image,将方格图作为渐变色图的子物体,因为Unity中的UI物体越在列表的下方则越靠近屏幕,自然可以将方格图显示在渐变色的前方。if (isGround){ playerAnimator.speed = 0; kingCrimson.SetActive(false);}else if (Input.GetMouseButton(0) && jetValue > 0){ --jetValue; GameManager.instance.SetJetSlider(jetValue / jetTimes); playerRigdbody.AddForce(Vector3.forward * jetSpeed, ForceMode.Impulse);}
关键词:真实,永远,抵达