Unity 2D项目3个编译错误修复求助(附C#代码)
修复编译错误的解决方案
错误根源分析
你的代码里包含了HTML转义字符(比如=>、<、&&),这些字符会被C#编译器识别为无效语法,直接导致编译失败。另外需确认你的Unity项目使用的C#版本支持表达式体成员(=>语法),Unity 2018及以上版本默认支持,若版本过低需在项目设置中调整脚本运行时版本。
修复后的完整代码
PlayerMovement 类
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { private Camera camera; private new Rigidbody2D rigidbody; private Vector2 velocity; private float inputAxis; public float moveSpeed = 8f; public float maxJumpHeight = 5f; public float maxJumpTime = 1f; public float jumpForce => (2f * maxJumpHeight) / (maxJumpTime / 2f); public float gravity => (-2f * maxJumpHeight) / Mathf.Pow((maxJumpTime / 2f), 2); public bool grounded { get; private set; } public bool jumping { get; private set; } private void Awake() { rigidbody = GetComponent<Rigidbody2D>(); camera = Camera.main; } private void Update() { HorizontalMovement(); grounded = rigidbody.Raycast(Vector2.down); if (grounded) { GroundedMovement(); } ApplyGravity(); } private void HorizontalMovement() { inputAxis = Input.GetAxis("Horizontal"); velocity.x = Mathf.MoveTowards(velocity.x, inputAxis * moveSpeed, moveSpeed * Time.deltaTime); } private void GroundedMovement() { velocity.y = Mathf.Max(velocity.y, 0f); jumping = velocity.y > 0f; if (Input.GetButtonDown("Jump")) { velocity.y = jumpForce; jumping = true; } } private void ApplyGravity() { bool falling = velocity.y < 0f; float multiplier = falling ? 2f : 1f; velocity.y += gravity * multiplier * Time.deltaTime; velocity.y = Mathf.Max(velocity.y, gravity / 2f); } private void FixedUpdate() { Vector2 position = rigidbody.position; position += velocity * Time.fixedDeltaTime; Vector2 leftEdge = camera.ScreenToWorldPoint(Vector2.zero); Vector2 rightEdge = camera.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height)); position.x = Mathf.Clamp(position.x, leftEdge.x + 0.5f, rightEdge.x - 0.5f); rigidbody.MovePosition(position); } }
Extensions 类
using System.Collections; using System.Collections.Generic; using UnityEngine; public static class Extensions { private static LayerMask layerMask = LayerMask.GetMask("Default"); public static bool Raycast(this Rigidbody2D rigidbody, Vector2 direction) { if (rigidbody.isKinematic) { return false; } float radius = 0.25f; float distance = 0.375f; RaycastHit2D hit = Physics2D.CircleCast(rigidbody.position, radius, direction, distance, layerMask); return hit.collider != null && hit.rigidbody != rigidbody; } }
额外运行注意事项
- 确保Player对象上挂载了
Rigidbody2D组件,且Gravity Scale设为0(代码中已手动处理重力逻辑)。 - 场景中必须存在标记为
MainCamera的相机,否则Camera.main会返回null导致报错。 - 地面对象的Layer需设置为
Default,否则扩展方法中的射线检测无法识别地面。
内容的提问来源于stack exchange,提问作者Alan Lienhard
相关产品推荐
相关产品推荐

