Гонки на Unity

Проекты в стадии разработки.

Гонки на Unity

Сообщение ufopes 19 май 2009, 00:50

http://forum.unity3d.com/viewtopic.php?t=13566 - я думаю скорее всего исходник, чем демо. Теперь я понял как заставить машину ездить).
ufopes
UNец
 
Сообщения: 4
Зарегистрирован: 19 май 2009, 00:39

Re: Гонки на Unity

Сообщение Sergvic 19 май 2009, 01:09

http://yogware.bluegillstudios.com/blog ... hysics.zip Тоже интересная машинка и скрипт полезный в проэкте
Sergvic
UNец
 
Сообщения: 8
Зарегистрирован: 12 май 2009, 10:37

Re: Гонки на Unity

Сообщение fox 19 май 2009, 09:49

Вот еще пример скрипта по управлению машинкой
http://www.unifycommunity.com/wiki/index.php?title=JCar
Добавить foxumkov в Skype
Мои проекты:
Turbodrive
Изображение

Изображение
Аватара пользователя
fox
UNITрон
 
Сообщения: 255
Зарегистрирован: 07 ноя 2008, 13:02
Откуда: Питер
  • ICQ

Re: Гонки на Unity

Сообщение Neodrop 19 май 2009, 10:13

Ещё в Networking Example есть.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Гонки на Unity

Сообщение ufopes 27 июн 2009, 23:47

У меня возникла проблема по исходнику Jcar. Делаю все в точности как в исходнике, но колеса машины крутятся у меня не вокруг своей оси, а вокруг оси цетра машины. Подскажите пожалуйста как исправить данную проблему?
Изображение
ufopes
UNец
 
Сообщения: 4
Зарегистрирован: 19 май 2009, 00:39

Re: Гонки на Unity

Сообщение gnoblin 28 июн 2009, 02:58

Sergvic писал(а):http://yogware.bluegillstudios.com/blogfiles/CarPhysics.zip Тоже интересная машинка и скрипт полезный в проэкте


У меня почему-то билдится синий экран... А в редакторе нормально. :-l
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Гонки на Unity

Сообщение ufopes 28 июн 2009, 22:01

ufopes писал(а):У меня возникла проблема по исходнику Jcar. Делаю все в точности как в исходнике, но колеса машины крутятся у меня не вокруг своей оси, а вокруг оси центра машины. Подскажите пожалуйста как исправить данную проблему?
Изображение

На офф форуме поднимался такой же вопрос: http://forum.unity3d.com/viewtopic.php?t=27220 и его там решили, но вот только я не совсем понял как.
ufopes
UNец
 
Сообщения: 4
Зарегистрирован: 19 май 2009, 00:39

Re: Гонки на Unity

Сообщение fox 30 июн 2009, 13:12

судя по скрину у тебя не совпадает центр колеса и WheelCollider-а, вот колесо и вращается вокруг центра колидера
Добавить foxumkov в Skype
Мои проекты:
Turbodrive
Изображение

Изображение
Аватара пользователя
fox
UNITрон
 
Сообщения: 255
Зарегистрирован: 07 ноя 2008, 13:02
Откуда: Питер
  • ICQ

Re: Гонки на Unity

Сообщение Lipton 03 июл 2009, 16:42

Нашел очень хороший пример гонок. В примере можно прокатиться на машине, танке, лодке, самолете и вертолете.
http://nilch.com/stump/VehiclesExample.zip
Lipton
UNец
 
Сообщения: 14
Зарегистрирован: 02 июл 2009, 20:45

Re: Гонки на Unity

Сообщение NOD 21 дек 2009, 23:42

Lipton писал(а):Нашел очень хороший пример гонок. В примере можно прокатиться на машине, танке, лодке, самолете и вертолете.
http://nilch.com/stump/VehiclesExample.zip


Взял скрип для авто отсюда, сделал свой проект, но наблюдаю странный баг. Если машинку ставлю на террейн, она не едет вообще, Если ставлю ее на какой то высоте, то машинка падает на брюхо, но колеса слетают с осей и слегка проваливаются в землю (по ступицу). Машинка начинает ехать, колеса поворачиваются как надо, но она едет как то на брюхе да к тому же на поворотах норовит опрокинутся и застрять. Посоветуйте как решить проблему?

Вот как это выглядит по шагам:

Машинка висит в воздухе:
Изображение

Машинка упала на землю, и тут же колеса слетели с осей почти на радиус колеса да к тому же почему то провалились под землю.
Изображение

Кстати почему машинку перекосило тоже не понятно. Впечатление что она уперлась в передние колеса и середину меша, хотя коллайдер корпуса у нее - бокс во всю длину корпуса.
Изображение

Ну собственно при этом все работает и ездит, но вот в таком виде, как по болоту :)
Изображение

И еще одна проблема, когда едешь назад, то колеса все равно крутятся вперед. Щас, блин, буду искать причину.

Далее собственно скрипт:

Скрытый текст:
//maximal corner and braking acceleration capabilities
var maxCornerAccel=10.0;
var maxBrakeAccel=10.0;

//Mass
var mass = 1500;

//coefficient of drag
var drag = 0.05;

//center of gravity height - effects tilting in corners
var cogY = 0.0;

//engine powerband
var minRPM = 700;
var maxRPM = 6000;

//maximum Engine Torque
var maxTorque = 400;

//automatic transmission shift points
var shiftDownRPM = 2500;
var shiftUpRPM = 5500;

//gear ratios
var gearRatios = [-2.66, 2.66, 1.78, 1.30, 1.00];
var finalDriveRatio = 3.4;

//a basic handling modifier:
//1.0 understeer
//0.0 oversteer
var handlingTendency = 0.7;

//graphical wheel objects
var wheelFR : Transform;
var wheelFR1: Transform;
var wheelFL : Transform;
var wheelFL1: Transform;
var wheelBR : Transform;
var wheelBR1 : Transform;
var wheelBL : Transform;
var wheelBL1 : Transform;

//suspension setup
var suspensionDistance = 0.3;
var springs = 1000;
var dampers = 200;
var wheelRadius = 0.45;

//particle effect for ground dust
var groundDustEffect : Transform;

private var queryUserInput = true;
private var engineRPM : float;
private var steerVelo = 0.0;
private var brake = 0.0;
private var handbrake = 0.0;
private var steer = 0.0;
private var motor = 0.0;
private var skidTime = 0.0;
private var onGround = false;
private var cornerSlip = 0.0;
private var driveSlip = 0.0;
private var wheelRPM : float;
private var gear = 1;
private var skidmarks;
private var wheels : WheelData[];
private var wheelY = 0.0;

//Functions to be used by external scripts
//controlling the car if required
//===================================================================

//return a status string for the vehicle
function GetStatus(gui : GUIText) {
gui.text="v="+(rigidbody.velocity.magnitude * 3.6).ToString("f1") + " km/h\ngear= "+gear+"\nrpm= "+engineRPM.ToString("f0");
}

//return an information string for the vehicle
function GetControlString(gui : GUIText) {
gui.text="Use arrow keys to control the jeep,\nspace for handbrake.";
}

//Setup main camera to follow vehicle
function SetupCamera() {
if(Camera.main.GetComponent(SmoothFollow)!=null)
{
Camera.main.GetComponent(SmoothFollow).enabled=true;
Camera.main.GetComponent(SmoothFollow).target=transform;
Camera.main.GetComponent(SmoothFollow).distance=7;
Camera.main.GetComponent(SmoothFollow).height=3;
}
Camera.main.transform.parent=null;
}

//Enable or disable user controls
function SetEnableUserInput(enableInput)
{
queryUserInput=enableInput;
}

//Car physics
//===================================================================

//some whee calculation data
class WheelData{
var rotation = 0.0;
var coll : WheelCollider;
var graphic : Transform;
var maxSteerAngle = 0.0;
var lastSkidMark = -1;
var powered = false;
var handbraked = false;
var originalRotation;
};

function Start () {
//Destroy existing rigidbody, we don't want anyone to mess with it.
if(rigidbody)
Destroy(rigidbody);

//setup rigidbody
gameObject.AddComponent(Rigidbody);
rigidbody.mass = mass;
rigidbody.drag = drag;
rigidbody.angularDrag = 0.8;
rigidbody.centerOfMass.y = cogY;
rigidbody.interpolation = RigidbodyInterpolation.Interpolate;

//start engine noise
audio.loop = true;
audio.Play();

//setup wheels
wheels=new WheelData[8];
for(i=0;i<8;i++)
wheels[i] = new WheelData();

wheels[0].graphic = wheelFL;
wheels[1].graphic = wheelFL1;
wheels[2].graphic = wheelFR;
wheels[3].graphic = wheelFR1;
wheels[4].graphic = wheelBL;
wheels[5].graphic = wheelBL1;
wheels[6].graphic = wheelBR;
wheels[7].graphic = wheelBR1;

wheels[0].maxSteerAngle=30.0;
wheels[1].maxSteerAngle=30.0;
wheels[2].maxSteerAngle=30.0;
wheels[3].maxSteerAngle=30.0;
wheels[4].maxSteerAngle=-30.0;
wheels[5].maxSteerAngle=-30.0;
wheels[6].maxSteerAngle=-30.0;
wheels[7].maxSteerAngle=-30.0;
wheels[4].powered=true;
wheels[5].powered=true;
wheels[6].powered=true;
wheels[7].powered=true;
wheels[4].handbraked=true;
wheels[5].handbraked=true;
wheels[6].handbraked=true;
wheels[7].handbraked=true;

for(w in wheels)
{
if(w.graphic==null)
Debug.Log("You need to assign all four wheels for the car script!");
if(!w.graphic.transform.IsChildOf(transform))
Debug.Log("Wheels need to be children of the Object with the car script");

w.originalRotation=w.graphic.localRotation;

//create collider
colliderObject = new GameObject("WheelCollider");
colliderObject.transform.parent = transform;
colliderObject.transform.localPosition = w.graphic.localPosition;
w.coll = colliderObject.AddComponent(WheelCollider);
w.coll.suspensionDistance = suspensionDistance;
w.coll.suspensionSpring.spring = springs;
w.coll.suspensionSpring.damper = dampers;
//no grip, as we simulate handling ourselves
w.coll.forwardFriction.stiffness = 0;
w.coll.sidewaysFriction.stiffness = 0;
w.coll.radius = wheelRadius;
}

//get wheel height (height forces are applied on)
wheelY=wheels[0].graphic.localPosition.y;


//shift to first
gear=1;
}

//update wheel status
function UpdateWheels()
{
//calculate handbrake slip for traction gfx
handbrakeSlip=handbrake*rigidbody.velocity.magnitude*0.1;
if(handbrakeSlip>1)
handbrakeSlip=1;

totalSlip=0.0;
onGround=false;
for(w in wheels)
{
//rotate wheel
w.rotation += wheelRPM / 60.0 * 360.0* Time.fixedDeltaTime;
w.rotation = Mathf.Repeat(w.rotation, 360.0);
w.graphic.localRotation= Quaternion.Euler( w.rotation, w.maxSteerAngle*steer, 0.0 ) * w.originalRotation;

//check if wheel is on ground
if(w.coll.isGrounded)
onGround=true;

slip = cornerSlip+(w.powered?driveSlip:0.0)+(w.handbraked?handbrakeSlip:0.0);
totalSlip += slip;

var hit : WheelHit;
var c : WheelCollider;
c = w.coll;
if(c.GetGroundHit(hit))
{
//if the wheel touches the ground, adjust graphical wheel position to reflect springs
w.graphic.localPosition.y-=Vector3.Dot(w.graphic.position-hit.point,transform.up)-w.coll.radius;

//create dust on ground if appropiate
if(slip>0.5 && hit.collider.tag=="Dusty")
{
groundDustEffect.position=hit.point;
groundDustEffect.particleEmitter.worldVelocity=rigidbody.velocity*0.5;
groundDustEffect.particleEmitter.minEmission=(slip-0.5)*3;
groundDustEffect.particleEmitter.maxEmission=(slip-0.5)*3;
groundDustEffect.particleEmitter.Emit();
}

//and skid marks
if(slip>0.75 && skidmarks != null)
w.lastSkidMark=skidmarks.AddSkidMark(hit.point,hit.normal,(slip-0.75)*2,w.lastSkidMark);
else
w.lastSkidMark=-1;
}
else w.lastSkidMark=-1;
}
totalSlip/=wheels.length;
}

//Automatically shift gears
function AutomaticTransmission()
{
if(gear>0)
{
if(engineRPM>shiftUpRPM&&gear<gearRatios.length-1)
gear++;
if(engineRPM<shiftDownRPM&&gear>1)
gear--;
}
}

//Calculate engine acceleration force for current RPM and trottle
function CalcEngine() : float
{
//no engine when braking
if(brake+handbrake>0.1)
motor=0.0;

//if car is airborne, just rev engine
if(!onGround)
{
engineRPM += (motor-0.3)*25000.0*Time.deltaTime;
engineRPM = Mathf.Clamp(engineRPM,minRPM,maxRPM);
return 0.0;
}
else
{
AutomaticTransmission();
engineRPM=wheelRPM*gearRatios[gear]*finalDriveRatio;
if(engineRPM<minRPM)
engineRPM=minRPM;
if(engineRPM<maxRPM)
{
//fake a basic torque curve
x = (2*(engineRPM/maxRPM)-1);
torqueCurve = 0.5*(-x*x+2);
torqueToForceRatio = gearRatios[gear]*finalDriveRatio/wheelRadius;
return motor*maxTorque*torqueCurve*torqueToForceRatio;
}
else
//rpm delimiter
return 0.0;
}
}

//Car physics
//The physics of this car are really a trial-and-error based extension of
//basic "Asteriods" physics -- so you will get a pretty arcade-like feel.
//This may or may not be what you want, for a more physical approach research
//the wheel colliders
function HandlePhysics () {
var velo=rigidbody.velocity;
wheelRPM=velo.magnitude*60.0*0.5;

rigidbody.angularVelocity=new Vector3(rigidbody.angularVelocity.x,0.0,rigidbody.angularVelocity.z);
dir=transform.TransformDirection(Vector3.forward);
flatDir=Vector3.Normalize(new Vector3(dir.x,0,dir.z));
flatVelo=new Vector3(velo.x,0,velo.z);
rev=Mathf.Sign(Vector3.Dot(flatVelo,flatDir));
//when moving backwards or standing and brake is pressed, switch to reverse
if((rev<0||flatVelo.sqrMagnitude<0.5)&&brake>0.1)
gear=0;
if(gear==0)
{
//when in reverse, flip brake and gas
tmp=brake;
brake=motor;
motor=tmp;

//when moving forward or standing and gas is pressed, switch to drive
if((rev>0||flatVelo.sqrMagnitude<0.5)&&brake>0.1)
gear=1;
}
engineForce=flatDir*CalcEngine();
totalbrake=brake+handbrake*0.5;
if(totalbrake>1.0)totalbrake=1.0;
brakeForce=-flatVelo.normalized*totalbrake*rigidbody.mass*maxBrakeAccel;

flatDir*=flatVelo.magnitude;
flatDir=Quaternion.AngleAxis(steer*30.0,Vector3.up)*flatDir;
flatDir*=rev;
diff=(flatVelo-flatDir).magnitude;
cornerAccel=maxCornerAccel;
if(cornerAccel>diff)cornerAccel=diff;
cornerForce=-(flatVelo-flatDir).normalized*cornerAccel*rigidbody.mass;
cornerSlip=Mathf.Pow(cornerAccel/maxCornerAccel,3);

rigidbody.AddForceAtPosition(brakeForce+engineForce+cornerForce,transform.position+transform.up*wheelY);

handbrakeFactor=1+handbrake*4;
if(rev<0)
handbrakeFactor=1;
veloSteer=((15/(2*velo.magnitude+1))+1)*handbrakeFactor;
steerGrip=(1-handlingTendency*cornerSlip);
if(rev*steer*steerVelo<0)
steerGrip=1;
maxRotSteer=2*Time.fixedDeltaTime*handbrakeFactor*steerGrip;
fVelo=velo.magnitude;
veloFactor=fVelo<1.0?fVelo:Mathf.Pow(velo.magnitude,0.3);
steerVeloInput=rev*steer*veloFactor*0.5*Time.fixedDeltaTime*handbrakeFactor;
if(velo.magnitude<0.1)
steerVeloInput=0;
if(steerVeloInput>steerVelo)
{
steerVelo+=0.02*Time.fixedDeltaTime*veloSteer;
if(steerVeloInput<steerVelo)
steerVelo=steerVeloInput;
}
else
{
steerVelo-=0.02*Time.fixedDeltaTime*veloSteer;
if(steerVeloInput>steerVelo)
steerVelo=steerVeloInput;
}
steerVelo=Mathf.Clamp(steerVelo,-maxRotSteer,maxRotSteer);
transform.Rotate(Vector3.up*steerVelo*57.295788);
}

function FixedUpdate () {
//query input axes if necessarry
if(queryUserInput)
{
brake = Mathf.Clamp01(-Input.GetAxis("Vertical"));
handbrake = Input.GetButton("Jump")?1.0:0.0;
steer = Input.GetAxis("Horizontal");
motor = Mathf.Clamp01(Input.GetAxis("Vertical"));
}
else
{
motor = 0;
steer = 0;
brake = 0;
handbrake = 0;
}


//if car is on ground calculate handling, otherwise just rev the engine
if(onGround)
HandlePhysics();
else
CalcEngine();

//wheel GFX
UpdateWheels();

//engine sounds
audio.pitch=0.5+0.2*motor+0.8*engineRPM/maxRPM;
audio.volume=0.5+0.8*motor+0.2*engineRPM/maxRPM;
}

//Called by DamageReceiver if boat destroyed
function Detonate()
{
//destroy wheels
for( w in wheels )
w.coll.gameObject.active=false;

//Mark object no longer a target for homing missiles.
if(tag=="MissileTarget")
tag="";

//no more car physics
enabled=false;
}

@script RequireComponent (AudioSource)
NOD
UNец
 
Сообщения: 36
Зарегистрирован: 20 дек 2009, 01:57

Re: Гонки на Unity

Сообщение warr11r 23 дек 2009, 11:25

Вроде на первый взгляд, у вас коллизии на колеса не прицеплены.
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

Re: Гонки на Unity

Сообщение NOD 29 дек 2009, 15:09

Я тоже думал что коллизии, но ведь они в скрипте прописаны... Вобщем сам разобрался. Были неправильно радиусы колес в скрипте заданы. Радиус колеса вычислил применив один раз к колесу wheelCollider. Он автоматически создаля по размерам колеса. Оттуда и взял параметры. Больше машина не проваливается. Отлично ездит. Теперь разбираюсь с турелью. Не пойму как звук в скрипте на вращение башни и выстрел прикрутить, можно ли сделать следы от колес с помощью нормалмэпа.
NOD
UNец
 
Сообщения: 36
Зарегистрирован: 20 дек 2009, 01:57

Re: Гонки на Unity

Сообщение warr11r 30 дек 2009, 00:40

Реализация скидмаркс (следов от шин) есть в Networking Example в сообщении 3153 от Neodrop, Админ, Питер, выше на странице.
Оттуда заимстована в Mars Explorer (в котором показано, как ею пользоваться).

Кстати, МЕ, отличный проект гонки, незаслуженно сдеся не упомянтый - http://s3.amazonaws.com/dat.marsxplr.com/mars/Mars.zip

Поиграть-почитать-покачать можно в его квартире за адресом: http://marsxplr.com/index


Кстати, Нод, у вас же башня стрелочками крутится? Возможно звук при истинности Инпата стрелки вписать?
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

Re: Гонки на Unity

Сообщение mp3 30 дек 2009, 09:02

Сообщение уже не 3153. Так как на сайте отображается сумма сообщений.
Be straight, or go forward.
Аватара пользователя
mp3
Адепт
 
Сообщения: 1071
Зарегистрирован: 21 окт 2009, 23:50

Re: Гонки на Unity

Сообщение warr11r 31 дек 2009, 00:41

Извините, не замечал. Непривычно как-то...
Ну да ладно, четвертое сверху.
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

След.

Вернуться в Кузня

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 4