Cinemachine-Konflikt bereitet Unity 2D-Spiel ProblemeC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Cinemachine-Konflikt bereitet Unity 2D-Spiel Probleme

Post by Anonymous »

Ich versuche, mein erstes ernsthaftes Projekt in Unity 2D (einem Plattformspiel im Stil von Hollow Knight) zu entwickeln und habe ein Problem mit CinemaChine in Unity 6.3. Das Problem ist, dass ich vier virtuelle Kameras und einen CameraManager mit Confider2D habe. Abgesehen davon, dass die Szenenränder nicht gut berücksichtigt werden (sogar die Wände mit dem 2D-Box-Collider verschmelzen), sind die Kameras widersprüchlich, weil zwei der vier verwendet werden, wenn der Spieler nach links oder rechts geht, und die restlichen zwei, wenn der Spieler fällt. Ich wollte einen fließenden Kameraübergang, aber wahrscheinlich aufgrund der Logik im Kameracode sind sie widersprüchlich. Die linke Kamera startet als wahr in der Szene, und wenn ich aus einer stationären Position springe, aktiviert sie die FallingRight-Kamera, was eigentlich nicht passieren sollte. Ich lasse den Player- und Kameracode hier, damit Sie ihn analysieren können.

Code: Select all

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController2D : MonoBehaviour
{
[Header("Movement")]
public float speed = 8f;
public float jumpForce = 12f;

[Header("Ground Check")]
public Transform groundCheck;
public float groundRadius = 0.25f;
public LayerMask groundLayer;

[Header("Gravity")]
public float fallGravityMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;

[Header("Wall Check")]
public Transform wallCheckLeft;
public Transform wallCheckRight;
public float wallCheckRadius = 0.2f;

Rigidbody2D rb;
float moveInput;
bool isGrounded;
float baseGravityScale;

bool isTouchingWall;
int wallDirection;

public  bool IsFacingRight = true;

public float wallSlideSpeed = 2f;

//Camera
public bool IsGrounded{get; private set;}

void Awake()
{
rb = GetComponent();
baseGravityScale = rb.gravityScale;

}

void Update()
{
CheckGround();
CheckWall();
HandleFlip();

}

void FixedUpdate()
{
// Horizontal move
rb.linearVelocity = new Vector2(moveInput * speed, rb.linearVelocity.y);

// Variable gravity
if (rb.linearVelocity.y < 0)
{
rb.gravityScale = baseGravityScale * fallGravityMultiplier;
}
else if (rb.linearVelocity.y > 0)
{
rb.gravityScale = baseGravityScale;
}
else
{
rb.gravityScale = baseGravityScale;
}
//Wall slide control
if (isTouchingWall && !isGrounded && rb.linearVelocity.y < 0 && moveInput == wallDirection)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, -wallSlideSpeed);
}

}

void CheckGround()
{
isGrounded = Physics2D.OverlapCircle(
groundCheck.position,
groundRadius,
groundLayer
);
}

public void OnMove(InputAction.CallbackContext context)
{
moveInput = context.ReadValue().x;
}

public void OnJump(InputAction.CallbackContext context)
{
// Pressed the button
if (context.performed && isGrounded)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
}

// drop the button  (jump cut)
if (context.canceled && rb.linearVelocity.y > 0)
{
rb.linearVelocity = new Vector2(
rb.linearVelocity.x,
rb.linearVelocity.y * 0.5f
);
}
}

void CheckWall()
{
bool left = Physics2D.OverlapCircle( wallCheckLeft.position,wallCheckRadius,groundLayer );
bool right = Physics2D.OverlapCircle( wallCheckRight.position,wallCheckRadius,groundLayer );

if(left)
{
isTouchingWall = true;
wallDirection = -1;
}
else if(right)
{
isTouchingWall = true;
wallDirection = 1;
}
else
{
isTouchingWall = false;
wallDirection = 0;
}
}
void HandleFlip()
{
if (IsFacingRight && moveInput< 0)
{
Flip();
}
else if (!IsFacingRight && moveInput > 0)
{
Flip();
}
}
void Flip()
{
IsFacingRight = !IsFacingRight;
Vector3 scaler = transform.localScale;
scaler.x *= -1;
transform.localScale = scaler;
}
}

Code: Select all

using UnityEngine;
namespace Unity.Cinemachine.Samples
{
/// 
/// This class inherits CinemachineCameraManagerBase, which is a convenient base class for
/// making complex cameras by transitioning between a number of worker cameras, depending
/// on some arbitrary game state.
///
/// In this case, we monitor the player's facing direction and motion, and select a camera
/// with the appropriate settings.  CinemachineCameraManagerBase takes care of handling the blends.
/// 
[ExecuteAlways]
public class PlatformerCamera2D : CinemachineCameraManagerBase
{
PlayerController2D playerController;
public enum PlayerState
{
Right,
Left,
FallingRight,
FallingLeft
}

[Space]
public float FallingSpeedThreshold = 0.1f;

// The cameras in these fields must be GameObject children of the manager camera.
[Header("State Cameras")]
[ChildCameraProperty] public CinemachineVirtualCameraBase RightCamera;
[ChildCameraProperty] public CinemachineVirtualCameraBase LeftCamera;
[ChildCameraProperty] public CinemachineVirtualCameraBase FallingRightCamera;
[ChildCameraProperty] public CinemachineVirtualCameraBase FallingLeftCamera;

Rigidbody2D m_Player;
PlayerState _currentState = PlayerState.Right;

protected override void OnEnable()
{
base.OnEnable();
var target = DefaultTarget.Enabled ? DefaultTarget.Target.TrackingTarget : null;
if (target != null)
m_Player = target.GetComponent();
playerController = target.GetComponent();
}

PlayerState GetPlayerState()
{
if (m_Player == null || playerController == null)
return _currentState;

bool isLeft = playerController.IsFacingRight == false;
bool isFalling =
!playerController.IsGrounded &&
m_Player.linearVelocity.y < -FallingSpeedThreshold;

PlayerState newState;

if (isFalling)
newState = isLeft ? PlayerState.FallingLeft : PlayerState.FallingRight;
else
newState = isLeft ? PlayerState.Left : PlayerState.Right;

_currentState = newState;
return _currentState;
}

/// 
/// Choose the appropriate child camera depending on player state.
/// 
protected override CinemachineVirtualCameraBase ChooseCurrentCamera(Vector3 worldUp, float deltaTime)
{
return GetPlayerState() switch
{
PlayerState.Left => LeftCamera,
PlayerState.FallingRight => FallingRightCamera,
PlayerState.FallingLeft => FallingLeftCamera,
_ => RightCamera,
};
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post