8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用物理服务器在 cpanel 和 whm 上部署 MERN 应用程序

joseville 2月前

92 0

我正在尝试通过 cpanel 和 whm 在生产服务器上安装我的开发项目,服务器是物理的,我正在使用 ubuntu,步骤是什么,而不会影响任何其他已部署的网站......

我正在尝试通过 cpanel 和 whm 在服务器上安装我的开发项目以供生产,服务器是物理的,我正在使用 ubuntu,请问步骤是什么,不影响任何其他已部署的网站,请注意 apache 默认安装在 cpanel 上。我正在使用 nodejs、express、react 和 mysql。我已经安装了 mysql 和 node 和 pm2,并且已经成功连接到我的节点应用程序中的 mysql,现在我只能在正确的位置部署我的节点应用程序,而无需编辑任何端口或影响任何其他网站并将其连接到我的 react 应用程序。注意:我可以访问 WHM 和 cPanel。

我尝试过使用 nginx,我的服务器可以工作,但是其他部署的网站都崩溃了,然后我发现当我尝试安装 nginx 时我错误地关闭了主端口 80,因此所有网站都崩溃了。现在我想在我的物理服务器上运行我的项目并在其上应用 ssh,而不影响任何其他端口或网站。

帖子版权声明 1、本帖标题:使用物理服务器在 cpanel 和 whm 上部署 MERN 应用程序
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由joseville在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我想要一种简单的方法来射击敌人并将他们从场景中消灭,这就是我所做的。还有其他方法吗?public class SpawnBullet : MonoBehaviour{ public GameObject

    我想要一种简单的方法来射击敌人并将他们从场景中消灭,这就是我所做的。还有其他方法吗?

    public class SpawnBullet : MonoBehaviour
    {
        public GameObject prefabBullett;
        public Transform centerBullett; // empty gameObject
    
        GameManager _gameManager;
    
        void Start()
        {
            _gameManager = FindObjectOfType<GameManager>();
        }
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                GameObject bullett= Instantiate(prefabBullett, centerBullett.position, centerBullett.rotation);
                Rigidbody rb = bullett.GetComponent<Rigidbody>();
          
          rb.AddForce(centerBullett.forward*10,ForceMode.Impulse);
    
                Destroy (bullett,2);
            }
        }
    }
    

    然后我创建了一个脚本来摧毁敌人

    private void OnCollisionEnter(Collision collision)
        {
            if (collision.gameObject.tag == "Bullett")
            {
                Destroy(gameObject);      //delete yourself
                Destroy(collision.gameObject);
            }
        }
    
  • 当尝试在 WSL(Ubuntu 24)中使用 mvn 运行 sudo(例如“sudo mvn spring-boot:run”)时,出现以下错误:“sudo: mvn: 未找到命令”。显然,maven 已安装并完美运行......

    尝试使用例如运行时 sudo mvn 出现 'sudo mvn spring-boot:run' 以下错误:。 'sudo: mvn: command not found' 显然,maven 已安装并完美运行 sudo 。此外, sudo 使用其他命令运行也可以正常工作,例如 sudo apt-get update 等。

    只是为了排除任何关于我为什么要尝试运行的问题 'sudo mvn spring-boot:run' ,因为当我在没有的情况下运行它时 sudo ,我的 SpringBoot 应用程序崩溃了 'java.net.BindException: Permission denied' ,可能是在端口 80 上,尽管错误堆栈跟踪没有这么说(在 application.preperties, server.port=80 ,并且端口未被使用,即 sudo lsof -i:80 没有显示任何内容)。

    上述 权限被拒绝 错误都发生在我的 WSL 和我的 AWS EC2 实例(也使用 Ubuntu 24)上,但我在 EC2 上克服它的方法是使用 sudo ,但我无法在 WSL 上做同样的事情。

    如有任何建议我将不胜感激。

  • 您可以在玩家和敌人之间使用射线投射,或者在每次刷新时进行碰撞检查。射线投射速度更快,但其简单形式不会考虑子弹时间和子弹下落。碰撞检查可以通过着色器计算(查看相交像素)完成。

  • 你的代码看起来不错,但是为什么你要在摧毁子弹之前放置摧毁自己的代码呢?这可能会引起问题。关于射击,如果你的子弹速度不太重要,最好使用射线投射。

  • 对类似问题有一个简单的解决方案。(需要指出的是,那里的许多其他答案都很糟糕。)

  • 您的解决方案很棒,尽管您在尝试两次破坏游戏对象时可能会遇到问题。

    我会在这里修改这一行:

    Destroy(bullett,2);
    

    对此:

    StartCoroutine(DestroySelfAfterDelay(bullett, 2));
    

    然后:

    private IEnumerator DestroySelfAfterDelay(GameObject target, float delay)
    {
        yield return new Waitforseconds(delay);
        
        if(target == null) // check it's not already been destroyed
            return;
    
        Destroy(target);
    }
    

    这将避免 NullRefrenceExeption .

    如果你要发射很多子弹,你也可以研究对象池。但目前这几乎是最简单的方法,如果它有效,那就保留它。

  • 文件:////home/user/.npm/_npx/1415fee72ff6294b/node_modules/create-vite/dist/index.mjs:48`),this.close()}_(t,s){return t.toLowerCase()===\'y\'?(this.value=!0,this.submit():t.toLowerCase()==...

    
    file:///home/user/.npm/_npx/1415fee72ff6294b/node_modules/create-vite/dist/index.mjs:48
    `),this.close()}_(t,s){return t.toLowerCase()==="y"?(this.value=!0,this.submit()):t.toLowerCase()==="n"?(this.value=!1,this.submit()):this.bell()}render(){this.closed||(this.firstRender?this.out.write(Ie.hide):this.out.write(Fr(this.outputText,this.out.columns)),super.render(),this.outputText=[_e.symbol(this.done,this.aborted),De.bold(this.msg),_e.delimiter(this.done),this.done?this.value?this.yesMsg:this.noMsg:De.gray(this.initialValue?this.yesOption:this.noOption)].join(" "),this.out.write(Lr.line+Ie.to(0)+this.outputText))}}var Hr=kr,Yr={TextPrompt:di,SelectPrompt:bi,TogglePrompt:Si,DatePrompt:ur,NumberPrompt:br,MultiselectPrompt:Ee,AutocompletePrompt:_r,AutocompleteMultiselectPrompt:jr,ConfirmPrompt:Hr};(function(e){const t=e,s=Yr,i=r=>r;function n(r,l,d={}){return new Promise((a,b)=>{const p=new s[r](l),h=d.onAbort||i,c=d.onSubmit||i,g=d.onExit||i;p.on("state",l.onState||i),p.on("submit",x=>a(c(x))),p.on("exit",x=>a(g(x))),p.on("abort",x=>b(h(x)))})}t.text=r=>n("TextPrompt",r),t.password=r=>(r.style="password",t.text(r)),t.invisible=r=>(r.style="invisible",t.text(r)),t.number=r=>n("NumberPrompt",r),t.date=r=>n("DatePrompt",r),t.confirm=r=>n("ConfirmPrompt",r),t.list=r=>{const l=r.separator||",";return n("TextPrompt",r,{onSubmit:d=>d.split(l).map(a=>a.trim())})},t.toggle=r=>n("TogglePrompt",r),t.select=r=>n("SelectPrompt",r),t.multiselect=r=>{r.choices=[].concat(r.choices||[]);const l=d=>d.filter(a=>a.selected).map(a=>a.value);return n("MultiselectPrompt",r,{onAbort:l,onSubmit:l})},t.autocompleteMultiselect=r=>{r.choices=[].concat(r.choices||[]);const l=d=>d.filter(a=>a.selected).map(a=>a.value);return n("AutocompleteMultiselectPrompt",r,{onAbort:l,onSubmit:l})};const o=(r,l)=>Promise.resolve(l.filter(d=>d.title.slice(0,r.length).toLowerCase()===r.toLowerCase()));t.autocomplete=r=>(r.suggest=r.suggest||o,r.choices=[].concat(r.choices||[]),n("AutocompletePrompt",r))})(oe);const Ft=oe,Vr=["suggest","format","onState","validate","onRender","type"],Re=()=>{};async function V(e=[],{onSubmit:t=Re,onCancel:s=Re}={}){const i={},n=V._override||{};e=[].concat(e);let o,r,l,d,a,b;const p=async(h,c,g=!1)=>{if(!(!g&&h.validate&&h.validate(c)!==!0))return h.format?await h.format(c,i):c};for(r of e)if({name:d,type:a}=r,typeof a=="function"&&(a=await a(o,{...i},r),r.type=a),!!a){for(let h in r){if(Vr.includes(h))continue;let c=r[h];r[h]=typeof c=="function"?await c(o,{...i},b):c}if(b=r,typeof r.message!="string")throw new Error("prompt message is required");if({name:d,type:a}=r,Ft[a]===void 0)throw new Error(`prompt type (${a}) is not defined`);if(n[r.name]!==void 0&&(o=await p(r,n[r.name]),o!==void 0)){i[d]=o;continue}try{o=V._injected?Br(V._injected,r.initial):await Ft[a](r),i[d]=o=await p(r,o,!0),l=await t(r,o,i)}catch{l=!await s(r,i)}if(l)return i}return i}function Br(e,t){const s=e.shift();if(s instanceof Error)throw s;return s===void 0?t:s}function Gr(e){V._injected=(V._injected||[]).concat(e)}function Jr(e){V._override=Object.assign({},e)}var Wr=Object.assign(V,{prompt:V,prompts:Ft,inject:Gr,override:Jr});const Ae=pt(Wr);let W=!0;const X=typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{};let it=0;if(X.process&&X.process.env&&X.process.stdout){const{FORCE_COLOR:e,NODE_DISABLE_COLORS:t,NO_COLOR:s,TERM:i,COLORTERM:n}=X.process.env;t||s||e==="0"?W=!1:e==="1"||e==="2"||e==="3"?W=!0:i==="dumb"?W=!1:"CI"in X.process.env&&["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE","DRONE"].some(o=>o in X.process.env)?W=!0:W=process.stdout.isTTY,W&&(process.platform==="win32"||n&&(n==="truecolor"||n==="24bit")?it=3:i&&(i.endsWith("-256color")||i.endsWith("256"))?it=2:it=1)}let je={enabled:W,supportLevel:it};function A(e,t,s=1){const i=`\x1B[${e}m`,n=`\x1B[${t}m`,o=new RegExp(`\\x1b\\[${t}m`,"g");return r=>je.enabled&&je.supportLevel>=s?i+(""+r).replace(o,i)+n:""+r}const B=A(0,0),ct=A(31,39),Ne=A(32,39),j=A(33,39),k=A(34,39),zr=A(35,39),Fe=A(36,39),Ur=A(91,39),qr=A(92,39),Lt=A(94,39),ut=_s(process.argv.slice(2),{string:["_"]}),kt=process.cwd(),Ht=[{name:"vanilla",display:"Vanilla",color:j,variants:[{name:"vanilla-ts",display:"TypeScript",color:k},{name:"vanilla",display:"JavaScript",color:j}]},{name:"vue",display:"Vue",color:Ne,variants:[{name:"vue-ts",display:"TypeScript",color:k},{name:"vue",display:"JavaScript",color:j},{name:"custom-create-vue",display:"Customize with create-vue \u2197",color:Ne,customCommand:"npm create vue@latest TARGET_DIR"},{name:"custom-nuxt",display:"Nuxt \u2197",color:qr,customCommand:"npm exec nuxi init TARGET_DIR"}]},{name:"react",display:"React",color:Fe,variants:[{name:"react-ts",display:"TypeScript",color:k},{name:"react-swc-ts",display:"TypeScript + SWC",color:k},{name:"react",display:"JavaScript",color:j},{name:"react-swc",display:"JavaScript + SWC",color:j},{name:"custom-remix",display:"Remix \u2197",color:Fe,customCommand:"npm create remix@latest TARGET_DIR"}]},{name:"preact",display:"Preact",color:zr,variants:[{name:"preact-ts",display:"TypeScript",color:k},{name:"preact",display:"JavaScript",color:j}]},{name:"lit",display:"Lit",color:Ur,variants:[{name:"lit-ts",display:"TypeScript",color:k},{name:"lit",display:"JavaScript",color:j}]},{name:"svelte",display:"Svelte",color:ct,variants:[{name:"svelte-ts",display:"TypeScript",color:k},{name:"svelte",display:"JavaScript",color:j},{name:"custom-svelte-kit",display:"SvelteKit \u2197",color:ct,customCommand:"npm create svelte@latest TARGET_DIR"}]},{name:"solid",display:"Solid",color:k,variants:[{name:"solid-ts",display:"TypeScript",color:k},{name:"solid",display:"JavaScript",color:j}]},{name:"qwik",display:"Qwik",color:Lt,variants:[{name:"qwik-ts",display:"TypeScript",color:Lt},{name:"qwik",display:"JavaScript",color:j},{name:"custom-qwik-city",display:"QwikCity \u2197",color:Lt,customCommand:"npm create qwik@latest basic TARGET_DIR"}]},{name:"others",display:"Others",color:B,variants:[{name:"create-vite-extra",display:"create-vite-extra \u2197",color:B,customCommand:"npm create vite-extra@latest TARGET_DIR"},{name:"create-electron-vite",display:"create-electron-vite \u2197",color:B,customCommand:"npm create electron-vite@latest TARGET_DIR"}]}],Le=Ht.map(e=>e.variants&&e.variants.map(t=>t.name)||[e.name]).reduce((e,t)=>e.concat(t),[]),Kr={_gitignore:".gitignore"},Yt="vite-project";async function Zr(){const e=ke(ut._[0]),t=ut.template||ut.t;let s=e||Yt;const i=()=>s==="."?O.basename(O.resolve()):s;let n;Ae.override({overwrite:ut.overwrite});try{n=await Ae([{type:e?null:"text",name:"projectName",message:B("Project name:"),initial:Yt,onState:u=>{s=ke(u.value)||Yt}},{type:()=>!E.existsSync(s)||tn(s)?null:"select",name:"overwrite",message:()=>(s==="."?"Current directory":`Target directory "${s}"`)+" is not empty. Please choose how to proceed:",initial:0,choices:[{title:"Remove existing files and continue",value:"yes"},{title:"Cancel operation",value:"no"},{title:"Ignore files and continue",value:"ignore"}]},{type:(u,{overwrite:y})=>{if(y==="no")throw new Error(ct("\u2716")+" Operation cancelled");return null},name:"overwriteChecker"},{type:()=>Ye(i())?null:"text",name:"packageName",message:B("Package name:"),initial:()=>Xr(i()),validate:u=>Ye(u)||"Invalid package.json name"},{type:t&&Le.includes(t)?null:"select",name:"framework",message:typeof t=="string"&&!Le.includes(t)?B(`"${t}" isn't a valid template. Please choose from below: `):B("Select a framework:"),initial:0,choices:Ht.map(u=>{const y=u.color;return{title:y(u.display||u.name),value:u}})},{type:u=>u&&u.variants?"select":null,name:"variant",message:B("Select a variant:"),choices:u=>u.variants.map(y=>{const m=y.color;return{title:m(y.display||y.name),value:y.name}})}],{onCancel:()=>{throw new Error(ct("\u2716")+" Operation cancelled")}})}catch(u){console.log(u.message);return}const{framework:o,overwrite:r,packageName:l,variant:d}=n,a=O.join(kt,s);r==="yes"?en(a):E.existsSync(a)||E.mkdirSync(a,{recursive:!0});let b=d||o?.name||t,p=!1;b.includes("-swc")&&(p=!0,b=b.replace("-swc",""));const h=sn(process.env.npm_config_user_agent),c=h?h.name:"npm",g=c==="yarn"&&h?.version.startsWith("1."),{customCommand:x}=Ht.flatMap(u=>u.variants).find(u=>u.name===b)??{};if(x){const u=x.replace(/^npm create /,()=>c==="bun"?"bun x create-":`${c} create `).replace("@latest",()=>g?"":"@latest").replace(/^npm exec/,()=>c==="pnpm"?"pnpm dlx":c==="yarn"&&!g?"yarn dlx":c==="bun"?"bun x":"npm exec"),[y,...m]=u.split(" "),G=m.map(M=>M.replace("TARGET_DIR",s)),{status:C}=Ps.sync(y,G,{stdio:"inherit"});process.exit(C??0)}console.log(`
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    
    SyntaxError: Unexpected token '.'
        at Loader.moduleStrategy (internal/modules/esm/translators.js:133:18)
    npm ERR! code 1
    npm ERR! path /home/user/Desktop/Master ReactJS
    npm ERR! command failed
    npm ERR! command sh -c create-vite "my-project" "--template" "react"
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /home/user/.npm/_logs/2024-05-03T06_00_32_505Z-debug-0.log
    

    npm create vite@latest 我的项目 -- --template reactcd 我的项目

  • 如果你在 /etc/sudoers 中有:

    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
    

    尝试添加 maven 目录:

    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/mnt/c/system/apache-maven-3.9.6/bin"
    
  • 您使用的是哪个版本的 Node?您很可能使用的是过时的版本,并且它正在运行较新的语法。您可以通过运行

  • 笔记:

    请提供完整的日志文件:( /home/user/.npm/_logs/2024-05-03T06_00_32_505Z-debug-0.log 似乎是 React 或 Vite 的环境问题)

    可能的解决方案:

    1. p1

    2. p2

  • M.A. 2月前 0 只看Ta
    引用 12

    我有一台 ubuntu 服务器 22.04。我安装了 Nginx,但是使用公网 IP 地址无法获取登录页面。server { listen 80 default_server; listen [::]:80 default_server; ...

    我有一台 ubuntu 服务器 22.04。我安装了 Nginx,但是使用公网 IP 地址无法获取登录页面。

    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            # SSL configuration
            #
            # listen 443 ssl default_server;
            # listen [::]:443 ssl default_server;
            #
            # Note: You should disable gzip for SSL traffic.
            # See: https://bugs.debian.org/773332
            #
            # Read up on ssl_ciphers to ensure a secure configuration.
            # See: https://bugs.debian.org/765782
            #
            # Self signed certs generated by the ssl-cert package
            # Don't use them in a production server!
            #
            # include snippets/snakeoil.conf;
    
            root /var/www/html;
    
            # Add index.php to the list if you are using PHP
            index index.html index.htm index.nginx-debian.html;
    
            server_name _;
    
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    try_files $uri $uri/ =404;
            }
    

    这是我的站点可用的默认配置

    ` Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2024-05-12 20:02:43 UTC; 3min 52s ago Docs: man:nginx(8) Process: 10033 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 10034 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 10035 (nginx) Tasks: 2 (limit: 1116) Memory: 2.5M CPU: 26ms`

    状态为活跃

    状态:活跃

    行动来自


    Nginx 完全允许任何地方
    Nginx HTTP 允许任何地方
    Nginx 完整版 (v6) 允许任意位置 (v6)
    Nginx HTTP (v6) 允许任何地方 (v6)

    不明飞行物状态

    如何访问 Nginx 登陆页面

  • 因此,对于我正在开发的游戏,我使用基于继承的有限状态系统作为敌人和老板的 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;
            }
        }
    }
    

    任何帮助都将不胜感激!:)

  • 哈哈,对于其他需要答案的人来说,我在提出这个问题后几乎立即想到了一个答案,世界运转的方式真有趣!

    解决方案是将新状态转换为特定的 AirPatrol 变量,然后对其进行修改。如果有人能教我更好的方法,我将不胜感激!

    更改的脚本:

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    
        AirPatrol patrolState = new AirPatrol();
        patrolState.speed = 1;
    
        SetNextState(patrolState);
    }
    
  • curl -v http:// ip 地址在终端中提供默认的 Nginx 页面 html。

  • [警告] 28844#28844: 0.0.0.0:80 上的冲突服务器名称 \'_\',已忽略,在 error_log 中

  • 引用 17

    我没有使用公共 IP 地址获取登陆页面。
    curl -v http:// ip 地址在终端中显示默认的 Nginx 页面 html

    我认为您的托管服务提供商不允许访问 HTTP 端口 80。也许是您的主机或托管管理面板上的防火墙配置。

    请检查一下。

  • 我有两个带有 RigidBody2D 的物体和两个 BoxColliders (2D),第一个是触发器,第二个是可碰撞的,我想关闭这两个物体之间的物理碰撞(我需要它让物体保持在...

    我有两个带有 RigidBody2D 的物体和两个 BoxColliders (2D),第一个是触发器,第二个是可碰撞的,我想关闭这两个物体之间的物理碰撞(我需要它让物体停留在地面)并让触发检测在代码中工作。

    我试图排除刚体中的层,但它也关闭了代码中的触发检测例如:我有脚本

    ...
    private void OnTriggerEnter2D(Collision2D coll) 
    {
        Debug.Log("Triggered");
    }
    

    在改变排除层之前它运行良好但碰撞是打开的当我改变一切都关闭(触发检测和碰撞)

    有人知道如何实现这一点吗?

  • 您尝试过使用图层吗?要实现盒式碰撞器中的对象不会发生物理碰撞但仍能检测触发事件,您需要对对象使用不同的图层并调整碰撞矩阵。

返回
作者最近主题: