我正在尝试通过 cpanel 和 whm 在生产服务器上安装我的开发项目,服务器是物理的,我正在使用 ubuntu,步骤是什么,而不会影响任何其他已部署的网站......
我正在尝试通过 cpanel 和 whm 在服务器上安装我的开发项目以供生产,服务器是物理的,我正在使用 ubuntu,请问步骤是什么,不影响任何其他已部署的网站,请注意 apache 默认安装在 cpanel 上。我正在使用 nodejs、express、react 和 mysql。我已经安装了 mysql 和 node 和 pm2,并且已经成功连接到我的节点应用程序中的 mysql,现在我只能在正确的位置部署我的节点应用程序,而无需编辑任何端口或影响任何其他网站并将其连接到我的 react 应用程序。注意:我可以访问 WHM 和 cPanel。
我尝试过使用 nginx,我的服务器可以工作,但是其他部署的网站都崩溃了,然后我发现当我尝试安装 nginx 时我错误地关闭了主端口 80,因此所有网站都崩溃了。现在我想在我的物理服务器上运行我的项目并在其上应用 ssh,而不影响任何其他端口或网站。
因此,对于我正在开发的游戏,我使用基于继承的有限状态系统作为敌人和老板的 AI。然而,我遇到了一些与它的实现有关的问题。基状态类是继承的...
因此,对于我正在开发的游戏,我使用基于继承的有限状态系统作为敌人和老板的 AI。然而,我在实施过程中遇到了一些问题。
每个状态都会继承基础状态类,例如 AirPatrol 状态继承自 \'EnemyState\'。但是,AirPatrol 类具有诸如 \'moveSpeed\'、\'aggroDistance\' 等变量(而 EnemyState 没有),我想从类外部访问这些变量,因此我将它们设为公共。在敌人的状态机类(管理切换状态等的地方)中,我有一个公共 \'currentState\' 变量,用于保存当前状态。
但是,如果我尝试引用 currentState.moveSpeed,则会收到“不包含定义”错误。我理解为什么这不起作用,因为并非每个 EnemyState 都有“moveSpeed”变量,但是有没有一种简单/可靠的方法来进行此类变量修改,而无需将速度变量添加到基本 EnemyState 类?
脚本如下:
安全无人机 AI 类(这是我的问题)
public class SecurityDroneAI : EnemyController
{
[Header("Movement")]
public float patrolSpeed = 3.0f;
public float aggroSpeed = 5.0f;
[SerializeField] float aggroDistance = 20f;
public float acceleration = 2f;
[Header("Pathfinding")]
public float pathUpdateDelay = 1.0f;
public List<Vector2> patrolPositions = new List<Vector2>();
public float nextWaypointDistance = 2;
Animator anim;
Rigidbody2D rb;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
SetNextState(new AirPatrol());
nextState.speed = 1; // HERE IS MY PROBLEM >:(
}
private void Update()
{
anim.SetBool("seeking", currentState.GetType() == typeof(AirPatrol));
float rot = -rb.velocity.x * 3;
}
}
敌国级
public class EnemyState
{
public Rigidbody2D rb;
public Animator anim;
public Transform transform;
public EnemyController controller;
public virtual void OnEnter(EnemyController parentController)
{
controller = parentController;
rb = controller.GetComponent<Rigidbody2D>();
anim = controller.GetComponentInChildren<Animator>();
transform = controller.transform;
}
public virtual void OnUpdate()
{
}
public virtual void OnFixedUpdate()
{
}
public virtual void OnLateUpdate()
{
}
public virtual void OnExit()
{
}
}
空中巡逻级
public class AirPatrol : EnemyState
{
public List<Vector2> patrolPositions = new List<Vector2>(); // List of positions to patrol between
public float speed = 3.0f; // Movement speed
public float acceleration = 2f; // Acceleration
public float pathUpdateDelay = 1.0f; // How often to update the path
public float nextWaypointDistance = 1.5f; // How far the patroller should check for the next waypoint
int positionIndex; // Index of the target position in patrolPositions
int currentWaypoint = 0; // Index of the current target waypoint on the current path
float timeSinceUpdatedPath; // Time since last generated path
Path path; // Current path
public Seeker seeker; // Seeker component for A* pathfinding
public override void OnEnter(EnemyController parentController)
{
base.OnEnter(parentController);
positionIndex = 0;
timeSinceUpdatedPath = 0;
}
public override void OnUpdate()
{
base.OnUpdate();
if (timeSinceUpdatedPath <= 0) // Update path if delayed enough
{
UpdatePath();
timeSinceUpdatedPath = pathUpdateDelay;
}
timeSinceUpdatedPath += Time.deltaTime;
if (path == null) { return; }
if (currentWaypoint >= path.vectorPath.Count) // At end of the path
{
positionIndex = positionIndex + 1 >= patrolPositions.Count ? 0 : positionIndex + 1; // Iterate to next patrol point
UpdatePath();
return;
}
MoveAlongPath();
}
private void MoveAlongPath()
{
Vector2 direction = (path.vectorPath[currentWaypoint] - transform.position).normalized;
rb.velocity = Vector3.Lerp(rb.velocity, direction * speed, acceleration * Time.deltaTime);
float distance = Vector2.Distance(rb.position, path.vectorPath[currentWaypoint]);
if (distance < nextWaypointDistance)
{
currentWaypoint++;
}
}
private void UpdatePath()
{
if (!seeker.IsDone()) { return; }
seeker.StartPath(transform.position, patrolPositions[positionIndex], SetPath);
}
private void SetPath(Path p)
{
if (p.error) { return; }
path = p;
currentWaypoint = 0;
}
}
敌方控制者等级
public class EnemyController : MonoBehaviour
{
public EnemyState mainStateType;
public EnemyState currentState;
public EnemyState nextState;
private void Update()
{
if (nextState != null)
{
SetState(nextState);
}
if (currentState != null) { currentState.OnUpdate(); }
}
private void LateUpdate()
{
if (currentState != null) { currentState.OnLateUpdate(); }
}
private void FixedUpdate()
{
if (currentState != null) { currentState.OnFixedUpdate(); }
}
private void SetState(EnemyState newState)
{
nextState = null;
if (currentState != null)
{
currentState.OnExit();
}
currentState = newState;
currentState.OnEnter(this);
}
public void SetNextState(EnemyState newState)
{
if (newState != null)
{
nextState = newState;
}
}
}
任何帮助都将不胜感激!:)