本帖最后由 C0mp1ler 于 7-13-2025 11:08 编辑
代码
几乎全部代码都是我负责。不过因为目前全都是烂大街的基础框架,并无必要自己造轮子,所以大约都是参考的youtube教程。我们前一版是依赖ai辅助写的,结果被证明是一坨史山。显然人类早就有更优的写法等着你抄。编程从来注重模仿借鉴,“ctrlc/v”的梗在ai之前就存在了许多年。私以为,ai只是降低了学习成本,不过能否找到更好的教程仍旧仰赖你的信息搜索能力。
移动代码的几个关键函数:private void MyInput()
{
horizontalInput = Input.GetAxisRaw("Horizontal");
verticalInput = Input.GetAxisRaw("Vertical");
if (Input.GetKey(jumpKey) && readyToJump && grounded && currentStamina >= staminaJumpCost) // 跳跃
{
readyToJump = false;
currentStamina -= staminaJumpCost;
Jump();
Invoke(nameof(ResetJump), jumpCooldown);
}
if (Input.GetKeyDown(crouchKey))
transform.localScale = new Vector3(transform.localScale.x, crouchYScale, transform.localScale.z);
if (Input.GetKeyUp(crouchKey))
transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z);
}
private void StateHandler() // 实际上这几个都是展开了写的,这样可读性太差了
{
if (Input.GetKey(crouchKey)) { state = MovementState.crouching; moveSpeed = crouchSpeed; }
else if (grounded && Input.GetKey(sprintKey) && currentStamina > 0 && cooldownTimer <= 0)
{ state = MovementState.sprinting; moveSpeed = sprintSpeed; }
else if (grounded) { state = MovementState.walking; moveSpeed = walkSpeed; }
else { state = MovementState.air; }
if (currentStamina <= 0) cooldownTimer = cooldownDuration; // 防止keyboard smash, 玩家一直按死疾跑
}
private void MovePlayer()
{
moveDirection = orientation.forward * verticalInput + orientation.right * horizontalInput;
if (OnSlope()) rb.AddForce(GetSlopeMoveDirection() * moveSpeed * 20f, ForceMode.Force);
else if (grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f, ForceMode.Force);
else rb.AddForce(moveDirection.normalized * moveSpeed * airMultiplier, ForceMode.Force);
rb.useGravity = !OnSlope();
}
private void Jump()
{
exitingSlope = true;
rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
}
private bool OnSlope() // 斜面,最困难的一集,ai一辈子都写不出来
{
if (Physics.Raycast(transform.position, Vector3.down, out slopeHit, playerHeight * 0.5f + 0.3f))
{
float angle = Vector3.Angle(Vector3.up, slopeHit.normal);
return angle < maxSlopeAngle && angle != 0;
}
return false;
}
镜头就是最公式化的写法。我的同学声称晃动要用animation搞,然而他一直在隐身。并且这是恐怖游戏,需要不规则晃动来增加代入感,所以我打算接下来用perlin噪声来写(记得督促我)。
手电筒:按f开关
门:按e开关。我专门写了一个doorcheck保持在门的原位:允许玩家在门打开,穿过门之后瞄准空气关门,防止紧张的追逐战中关不上门
如图示:(原本需要瞄准门)
代码就是这样,实际进度约等于0,而且移动还有要优化的:斜对着墙时手感黏糊糊的,走不动路;手电筒会穿模。大致就是这样,美术明天讲(相比代码更烂)。
|