Cara mengumpulkan laba-laba di Godot, Unigine, atau PlayCanvas

Selamat tahun ke-21 abad ke-21.



Pada artikel ini saya akan membahas fitur-fitur bekerja di tiga mesin permainan, menggunakan contoh penulisan kode untuk kendaraan arakhnida.







Struktur umum dari "mobil laba-laba" diasumsikan sebagai berikut - ada 6 cakar, masing-masing salinan skrip kontrol, yang melacak pergerakan struktur utama dan memindahkan cakarnya ke posisi baru ketika ia bergerak menjauh pada jarak tertentu.

Untuk pendaratan cakar yang lebih akurat, direncanakan untuk menambahkan raycast, tetapi, misalnya, di Godot yang sama saya ingin membuat laba-laba untuk game dengan tampilan atas, di mana akurasi seperti itu tidak terlalu diperlukan.



Jadi, tugasnya adalah membentuk struktur yang diinginkan di dalam mesin dan menulis kode untuk kaki terpisah. Inilah yang terjadi di lingkungan pengembangan yang berbeda:







Godot



Di sini saya sudah memiliki proyek kecil dengan mobil dan laba-laba siap, saya memutuskan untuk menambahkannya ke salah satu adegan (prefab) yang berisi subkelas mobil yang tidak memiliki roda.



Adegan spesifik_base itu sendiri diatur sedemikian rupa sehingga pada dasarnya adalah simpul tiruan, yang hanya menggantung di suatu tempat di dunia, tanpa gerakan, dan tubuh kinematik di dalamnya bergerak ke seluruh dunia. Kamera ada di dalam pemandangan, tetapi di luar tubuh, hanya dengan mengikutinya.







Untuk membuat laba-laba, saya menambahkan simpul terpisah di dalam tubuh, yang berisi titik-titik boneka untuk cakar (di mana mereka ditempatkan di tanah, bukan di tempat mereka melekat pada tubuh).







Untuk kenyamanan, saya menempatkan cakar itu sendiri di sini, dalam pemandangan ini, tetapi di luar tubuh. Skrip yang mengontrol masing-masing, selain menggerakkan cakarnya, akan terus membukanya ke tengah "laba-laba".





Kode di dalam editor Godot



Menulis kode. Saya menggunakan GDScript, karena saya tidak melihat banyak gunanya menulis di C # di Godot (bukan penggemar kurung kurawal):



extends Spatial

export var distance = 2.5# ,    
export var step = 1#     ( )

#        ,      
export (NodePath) var spidercenter = null
var trg_center

export (NodePath) var spiderleg = null
var trg_leg

#     x  z
var x_dis = 0.0
var z_dis = 0.0

#-,   
var time_lag = -1.0

# 
func _ready():
	self.hide()# 
	trg_center = get_node(spidercenter)# 
	trg_leg = get_node(spiderleg)
	LegPlace()#      

#  
func _process(delta):
        #     .   ,      
	self.look_at(trg_center.global_transform.origin, Vector3(0,1,0))
	
        # ,    .    ,    ,         (             ,      ).              LegPlace
	if self.visible == false: self.show()

	if time_lag>=0:# - ,    
		time_lag +=1*delta 
		if time_lag>0.06:#       
			time_lag = -1.0
			LegPlace()
	else:#            
		x_dis = abs(trg_leg.global_transform.origin.x - self.global_transform.origin.x)
		z_dis = abs(trg_leg.global_transform.origin.z - self.global_transform.origin.z)
	
		if (x_dis + z_dis) > distance:#   ,  
			time_lag = 0.0
	
	pass
	
func LegPlace():#,    
	self.hide()
	step = step*(-1)
	self.global_transform.origin = trg_leg.global_transform.origin+Vector3(0,0,0.5*step)

      
      







Cutscene adonan laba-laba Godot. Sebagai bonus, itu juga termasuk saat-saat dari permainan terpisah dengan terraforming dunia voxel, di mana "laba-laba" juga digunakan, tetapi murni animasi, serta demo dengan mobil di playcanvas, sebelum bentuk laba-laba ditambahkan di sana.







Unigine



Setelah implementasi untuk Godot siap, saya memutuskan untuk mentransfer solusi ini ke mesin Unigine. Di sana saya juga memiliki proyek dengan mobil , meskipun agar tidak membebani, saya membuat garpu "laba-laba" yang terpisah, sehingga nanti, mungkin, melepas roda sepenuhnya dan mengembangkannya secara terpisah.







Ada seluruh adegan dunia game di mana tubuh mobil pemain berada. Di awal permainan, roda yang terletak terpisah dipasang ke bodi ini.

Saya mencari boneka di dalam tubuh, di dalamnya akan ada titik-titik yang mengatur posisi cakarnya.







Cakar hanya ditempatkan di dunia game. Gerakan itu sendiri dibiarkan terwujud melalui roda, tetapi representasi visualnya dinonaktifkan.





Unigine meluncurkan lingkungan eksternal untuk kode pengeditan



Kode:



using System;// ""
using System.Collections;
using System.Collections.Generic;
using Unigine;

//  ,    
[Component(PropertyGuid = "5a8dd6f85781adf7567432eae578c5414581ddac")]
public class theLegBehavior : Component
{

	[ShowInEditor][Parameter(Tooltip = "CenterSpider")]//   
	private Node spiderCenter = null;
	[ShowInEditor][Parameter(Tooltip = "Target Leg Point")]//   
	private Node legPoint = null;

	//     
	private float x_dis= 0.0f;
	private float z_dis= 0.0f;

	private float ifps;//  
	private float time_lag = -1.0f;//-

	private void Init()//
	{
		node.Enabled = false;// 
		LegPlace();//  
		
	}
	
	private void Update()// 
	{
		ifps = Game.IFps;// 

		if (time_lag>=0.0f){//   
			time_lag += 1.0f*ifps;

			if (time_lag>=0.6f) {
				time_lag = -1.0f;
				LegPlace();
			}
		
		}else{
			x_dis = MathLib.Abs(legPoint.WorldPosition.x - node.WorldPosition.x);
			z_dis = MathLib.Abs(legPoint.WorldPosition.z - node.WorldPosition.z);
            	
			if (x_dis + z_dis > 0.8f){
				time_lag = 0.0f;
			}
			
		}

	}

        //   .        .         .       ,  ,    ,     - .         ,      Update.
	private void LegPlace()
	{
		node.Enabled = false;

		vec3 targetDirection = vec3.ZERO;
		targetDirection = (legPoint.WorldPosition - node.WorldPosition);

		quat targetRot = new quat(MathLib.LookAt(vec3.ZERO, targetDirection, vec3.UP, MathLib.AXIS.Y));

		quat delta = MathLib.Inverse(targetRot);
		delta.z = 0;
		delta.Normalize();

		node.WorldPosition = legPoint.WorldPosition;

        targetDirection = (spiderCenter.WorldPosition - node.WorldPosition);
		node.SetWorldDirection(targetDirection, vec3.UP, MathLib.AXIS.Y);

		node.Enabled = true;		
	}
}

      
      







Unigine Spider Dough Cutscene







PlayCanvas



PlayCanvas adalah mesin game webGL yang menggunakan javascript. Baru-baru ini saya mulai memahaminya. Ini terlihat seperti persilangan antara Unity dan Godot, tetapi dengan pengembangan online - editor terbuka di browser.



Dalam hal ini, saya membuat ulang salah satu contoh yang ditawarkan oleh platform ini, menambahkan beberapa model mobil saya, sedikit fungsi tambahan seperti melompat, menambahkan kamera, dan bermain dengan bahan / pengaturan.



Representasi visual mobil pangkalan dalam contoh asli diberikan oleh model solid, yang saya nonaktifkan sebagian, hanya menyisakan roda, yang ditarik dari bagian dalam model oleh skrip kontrolnya (yaitu, mereka tidak digulung oleh node terpisah dalam hierarki adegan). Visual ini melekat pada model roda fisik yang bergerak selama bermain game.

Untuk menerapkan "laba-laba" dalam proyek ini, saya membuat "pusat laba-laba" di dalam representasi visual mobil. Untuk kenyamanan, "tubuh laba-laba" bersarang di dalamnya, karena saya ingin segera beralih ke "bentuk laba-laba" dan kembali.







Jadi, "laba-laba" lokal juga ditempatkan di atas penggerak roda, dan roda itu sendiri tersembunyi. Mungkin akan lebih tepat untuk memasang bingkai laba-laba ke simpul fisika, tetapi beralih antar bentuk sudah ada di skrip simpul dengan visual mobil, dan model lain ada di dalam simpul ini, jadi saya memilih opsi ini untuk kesederhanaan. Nyatanya, ternyata visual dalam skripnya bergerak di belakang physics, dan skrip cakar tersebut sudah melihat frame laba-laba yang bergerak mengikuti visualnya. Secara teori, mungkin ada beberapa desinkronisasi di sini, setidaknya saya perhatikan bahwa pada perangkat yang lemah beberapa cakar tidak punya waktu untuk menghitung posisi dan hanya beberapa gerakan.

Jadi, secara umum, solusinya, tentu saja, tidak terikat pada fisika atau benda kaku, kaki, pada kenyataannya, tidak peduli bagaimana Anda memindahkan objek utama - dengan gaya atau hanya dengan mengubah posisi.







Cakar terletak di tempat kejadian itu sendiri, tetapi untuk kenyamanan mengaktifkan / menonaktifkannya, mereka dikumpulkan di dalam simpul terpisah sehingga Anda dapat menonaktifkannya, dan tidak masing-masing dengan tautan terpisah.





Di playcanvas, editor kode diluncurkan di tab browser baru.



Kode:



var TheLegBehavior = pc.createScript('theLegBehavior');

//   
TheLegBehavior.attributes.add('N_spiderCenter', { type: 'entity' });
//     
TheLegBehavior.attributes.add('N_legPoint', { type: 'entity' });

//    
this.x_dis = 0.0;
this.z_dis = 0.0;

this.time_lag = -1.0;//-

//  ,     , -     
TheLegBehavior.prototype.initialize = function() {    
};

// 
TheLegBehavior.prototype.update = function(dt) {
    if (this.N_spiderCenter) {//  -    
        this.entity.lookAt(this.N_spiderCenter.getPosition());// ,     
    }
};

//.       ,     , , ,   .
TheLegBehavior.prototype.postUpdate = function(dt) {
    //,      
    if (time_lag>=0.0){
        time_lag+=1.0*dt;
        if (time_lag>=0.06){
            time_lag=-1.0;
            this.LegUpdate();
        }
        
    } else {
        
        x_dis = Math.abs(this.entity.getPosition().x-this.N_legPoint.getPosition().x);
        z_dis = Math.abs(this.entity.getPosition().z-this.N_legPoint.getPosition().z);
        
        if ((x_dis+z_dis)>3.0){
         time_lag=0.0;
        }
        
        
    }
};

//      ,        ", , ",       
TheLegBehavior.prototype.LegUpdate = function() {
    
    if (this.N_legPoint) {// ,   ,     
        this.entity.setPosition(this.N_legPoint.getPosition());
    }
      
};

      
      





Secara umum, sejauh ini kami telah memperoleh laba-laba kosong dengan empat kaki dan perhitungannya tidak cukup optimal.



Anda dapat menguji bingkai yang dihasilkan di

sini .



Saya pribadi mencoba menjalankan pada smartphone yang tidak terlalu kuat melalui Chrome dan Dolphin, grafiknya menjadi mirip dengan PsOne dan perhitungan untuk beberapa kaki tidak berfungsi, sementara level terlihat di layar, kaki muncul di tepi peta. Pada laptop yang lemah, ada rem yang sangat kuat di Chrome, tetapi semuanya berjalan dengan baik di Firefox. Pada laptop dengan kartu video diskrit dan pada alat tulis itu terbang di kedua browser ini.



Pada PC, tidak seperti smartphone, demo ini menjalankan lompatan (dengan menekan bilah spasi), menyiapkan pemberondongan (Q dan E) dan memuat ulang level (di R).



Hasil



Seperti yang Anda lihat, bahasa dan mesin berbeda, namun demikian, banyak hal dalam keluarga bahasa skrip dilakukan dengan cara yang agak mirip. Seberapa sering Anda menguasai mesin game dan kerangka kerja baru, apa kesulitan utama yang Anda hadapi?



All Articles