找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 161|回复: 2

[DevLog] Unity恐怖游戏 Tom: The Nightmare V0.1

[复制链接]

6

主题

36

回帖

366

积分

版主

积分
366
发表于 7-13-2025 10:53:22 | 显示全部楼层 |阅读模式
本帖最后由 C0mp1ler 于 7-13-2025 11:03 编辑

背景
倘若点进来的大佬对Unity有所了解,定会质疑我们(我和我同学)的产能怎么如此之低。虽然想法在上个学期就已然形成,然后在学期初便写了一些代码。但是因为代码实在太史,于是便在暑假开始时重构了一遍。我们对unity和c#虽然声称略通一二,但是基本五六年遇到什么都是现查教程,边学边做。大多会议最末都会转到CS上去(难绷),再添上我最近一周每天上课,他要备考托福,因而开发受阻——尽管实际上大约也没什么东西(全套移动、手电、门),不过接下来一周产能兴许会提升。总之是一款校园题材的流程向恐怖游戏,主旨和讽刺有关,具体内容暂不透露。实际上就是没定好,我们的编剧美美隐身了捏。


目前的unity界面如下:
用来测试的斜面、墙和门,难绷的怪物建模。

结构:
主要特点就是用一个cameraholder来挂摄像机,防止各种物理问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

6

主题

36

回帖

366

积分

版主

积分
366
 楼主| 发表于 7-13-2025 11:06:41 | 显示全部楼层
本帖最后由 C0mp1ler 于 7-13-2025 11:08 编辑

代码
几乎全部代码都是我负责。不过因为目前全都是烂大街的基础框架,并无必要自己造轮子,所以大约都是参考的youtube教程。我们前一版是依赖ai辅助写的,结果被证明是一坨史山。显然人类早就有更优的写法等着你抄。编程从来注重模仿借鉴,“ctrlc/v”的梗在ai之前就存在了许多年。私以为,ai只是降低了学习成本,不过能否找到更好的教程仍旧仰赖你的信息搜索能力。

移动代码的几个关键函数:
  1. private void MyInput()
  2. {
  3.     horizontalInput = Input.GetAxisRaw("Horizontal");
  4.     verticalInput = Input.GetAxisRaw("Vertical");

  5.     if (Input.GetKey(jumpKey) && readyToJump && grounded && currentStamina >= staminaJumpCost) // 跳跃
  6.     {
  7.         readyToJump = false;
  8.         currentStamina -= staminaJumpCost;
  9.         Jump();
  10.         Invoke(nameof(ResetJump), jumpCooldown);
  11.     }

  12.     if (Input.GetKeyDown(crouchKey))
  13.         transform.localScale = new Vector3(transform.localScale.x, crouchYScale, transform.localScale.z);
  14.     if (Input.GetKeyUp(crouchKey))
  15.         transform.localScale = new Vector3(transform.localScale.x, startYScale, transform.localScale.z);
  16. }

  17. private void StateHandler() // 实际上这几个都是展开了写的,这样可读性太差了
  18. {
  19.     if (Input.GetKey(crouchKey)) { state = MovementState.crouching; moveSpeed = crouchSpeed; }
  20.     else if (grounded && Input.GetKey(sprintKey) && currentStamina > 0 && cooldownTimer <= 0)
  21.         { state = MovementState.sprinting; moveSpeed = sprintSpeed; }
  22.     else if (grounded) { state = MovementState.walking; moveSpeed = walkSpeed; }
  23.     else { state = MovementState.air; }

  24.     if (currentStamina <= 0) cooldownTimer = cooldownDuration; // 防止keyboard smash, 玩家一直按死疾跑
  25. }

  26. private void MovePlayer()
  27. {
  28.     moveDirection = orientation.forward * verticalInput + orientation.right * horizontalInput;
  29.    
  30.     if (OnSlope()) rb.AddForce(GetSlopeMoveDirection() * moveSpeed * 20f, ForceMode.Force);
  31.     else if (grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f, ForceMode.Force);
  32.     else rb.AddForce(moveDirection.normalized * moveSpeed * airMultiplier, ForceMode.Force);

  33.     rb.useGravity = !OnSlope();
  34. }

  35. private void Jump()
  36. {
  37.     exitingSlope = true;
  38.     rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
  39.     rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
  40. }

  41. private bool OnSlope() // 斜面,最困难的一集,ai一辈子都写不出来
  42. {
  43.     if (Physics.Raycast(transform.position, Vector3.down, out slopeHit, playerHeight * 0.5f + 0.3f))
  44.     {
  45.         float angle = Vector3.Angle(Vector3.up, slopeHit.normal);
  46.         return angle < maxSlopeAngle && angle != 0;
  47.     }
  48.     return false;
  49. }
复制代码


镜头就是最公式化的写法。我的同学声称晃动要用animation搞,然而他一直在隐身。并且这是恐怖游戏,需要不规则晃动来增加代入感,所以我打算接下来用perlin噪声来写(记得督促我)。
手电筒:按f开关
:按e开关。我专门写了一个doorcheck保持在门的原位:允许玩家在门打开,穿过门之后瞄准空气关门,防止紧张的追逐战中关不上门
如图示:(原本需要瞄准门)


代码就是这样,实际进度约等于0,而且移动还有要优化的:斜对着墙时手感黏糊糊的,走不动路;手电筒会穿模。大致就是这样,美术明天讲(相比代码更烂)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

0

主题

15

回帖

98

积分

提示词程序员

积分
98
发表于 7-13-2025 12:54:51 | 显示全部楼层
顶,支持lz,什么时候更美术部分
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 7-24-2025 03:56 , Processed in 0.059565 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表