Unity 机器学习代理工具包 (ML-Agents) 是一个开源项目,它使游戏和模拟能够作为训练智能代理的环境。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

95 行
2.8 KiB

using System;
using Cinemachine.Utility;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float Speed;
public float VelocityDamping;
public float JumpTime;
public enum ForwardMode { Camera, Player, World };
public ForwardMode InputForward;
public bool RotatePlayer = true;
public Action SpaceAction;
public Action EnterAction;
Vector3 m_currentVleocity;
float m_currentJumpSpeed;
float m_restY;
private void Reset()
{
Speed = 5;
InputForward = ForwardMode.Camera;
RotatePlayer = true;
VelocityDamping = 0.5f;
m_currentVleocity = Vector3.zero;
JumpTime = 1;
m_currentJumpSpeed = 0;
}
private void OnEnable()
{
m_currentJumpSpeed = 0;
m_restY = transform.position.y;
SpaceAction -= Jump;
SpaceAction += Jump;
}
void Update()
{
Vector3 fwd;
switch (InputForward)
{
case ForwardMode.Camera: fwd = Camera.main.transform.forward; break;
case ForwardMode.Player: fwd = transform.forward; break;
case ForwardMode.World: default: fwd = Vector3.forward; break;
}
fwd.y = 0;
fwd = fwd.normalized;
if (fwd.sqrMagnitude < 0.01f)
return;
Quaternion inputFrame = Quaternion.LookRotation(fwd, Vector3.up);
Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
input = inputFrame * input;
var dt = Time.deltaTime;
var desiredVelocity = input * Speed;
var deltaVel = desiredVelocity - m_currentVleocity;
m_currentVleocity += Damper.Damp(deltaVel, VelocityDamping, dt);
transform.position += m_currentVleocity * dt;
if (RotatePlayer && m_currentVleocity.sqrMagnitude > 0.01f)
{
var qA = transform.rotation;
var qB = Quaternion.LookRotation(
(InputForward == ForwardMode.Player && Vector3.Dot(fwd, m_currentVleocity) < 0)
? -m_currentVleocity : m_currentVleocity);
transform.rotation = Quaternion.Slerp(qA, qB, Damper.Damp(1, VelocityDamping, dt));
}
// Process jump
if (m_currentJumpSpeed != 0)
m_currentJumpSpeed -= 10 * dt;
var p = transform.position;
p.y += m_currentJumpSpeed * dt;
if (p.y < m_restY)
{
p.y = m_restY;
m_currentJumpSpeed = 0;
}
transform.position = p;
if (Input.GetKeyDown(KeyCode.Space) && SpaceAction != null)
SpaceAction();
if (Input.GetKeyDown(KeyCode.Return) && EnterAction != null)
EnterAction();
}
public void Jump() { m_currentJumpSpeed += 10 * JumpTime * 0.5f; }
}