Unity3d Tank Tutorial

Научился сам? Помоги начинающему.

Re: Unity3d Tank Tutorial

Сообщение ASD 24 фев 2013, 18:36

Я на основании урока по танковой ходовой сделал мини-превьюшку возможно будущей игры. Заценить то что на данный момент получилось можно тут http://46.172.64.37/webplayer.html
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Unity3d Tank Tutorial

Сообщение beneben 24 мар 2013, 23:52

можешь скинуть исходники в лс?)
wmr подкину)
ну или совместно можно заняться игрушкой)
beneben
UNец
 
Сообщения: 22
Зарегистрирован: 22 мар 2013, 10:55

Re: Unity3d Tank Tutorial

Сообщение ASD 25 мар 2013, 09:14

Танками пока не занимаюсь, влом с сетью разбираться. Отложил на время, переключился на аднроиды. Все исходники в любом случае не скину, если интересуют какие-то моменты по реализации - спрашивай тут, отвечу с кусками кода. Для того и запостил в Уроки
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Unity3d Tank Tutorial

Сообщение Alexess 21 май 2013, 00:26

Во 2-м уроке в пункте 3. Устанавливаем Wheel Collider’ы и параметры колес
Непонятно создавать новый файл скрипта или это один большой?
Если это один скрипт, то зачем его нужно было разбивать, это неудобно и путаницы возникает больше.
Если это другой файл, то какое имя, и куда должен быть привязан?

Я тут выяснил что многие именно на этом пункте застряли
Alexess
UNец
 
Сообщения: 1
Зарегистрирован: 21 май 2013, 00:22

Re: Unity3d Tank Tutorial

Сообщение ASD 17 июн 2013, 15:49

Это всё один файл, в конце он весь приведен целиком. Как будет время - сделаю ассет для танка на основании этих уроков
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Unity3d Tank Tutorial

Сообщение iillyyaa2033 06 авг 2013, 16:36

дайте пожалуйста конечный скрипт из второго урока.
iillyyaa2033
UNец
 
Сообщения: 9
Зарегистрирован: 17 май 2013, 16:22

Re: Unity3d Tank Tutorial

Сообщение md.kostya 06 авг 2013, 19:31

да ребят, поделитесь скриптом
Вот есть скрипт
Скрытый текст:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; //1

public class TankTrackController : MonoBehaviour {
   
    public GameObject wheelCollider; //2
   
    public float wheelRadius = 0.15f; //3
    public float suspensionOffset = 0.05f; //4
       
    public float trackTextureSpeed = 2.5f; //5
       
    public GameObject leftTrack;  //6
    public Transform[] leftTrackUpperWheels; //7
    public Transform[] leftTrackWheels; //8
    public Transform[] leftTrackBones; //9
   
    public GameObject rightTrack; //6
    public Transform[] rightTrackUpperWheels; //7
    public Transform[] rightTrackWheels; //8
    public Transform[] rightTrackBones; //9
   
    public class WheelData { //10
        public Transform wheelTransform; //11
        public Transform boneTransform; //12
        public WheelCollider col; //13
        public Vector3 wheelStartPos; //14
        public Vector3 boneStartPos; //15
        public float rotation = 0.0f; //16
        public Quaternion startWheelAngle;      //17
    }
   
    protected WheelData[] leftTrackWheelData; //18
    protected WheelData[] rightTrackWheelData; //18
   
    protected float leftTrackTextureOffset = 0.0f; //19
    protected float rightTrackTextureOffset = 0.0f; //19
        void Awake() {
                 
    leftTrackWheelData = new WheelData[leftTrackWheels.Length]; //1
    rightTrackWheelData = new WheelData[rightTrackWheels.Length]; //1
             
    for&#40;int i=0;i<leftTrackWheels.Length;i++&#41;{
        leftTrackWheelData[i] = SetupWheels&#40;leftTrackWheels[i],leftTrackBones[i]&#41;;  //2
    }
         
    for&#40;int i=0;i<rightTrackWheels.Length;i++&#41;{
        rightTrackWheelData[i] = SetupWheels&#40;rightTrackWheels[i],rightTrackBones[i]&#41;; //2  
    }

    Vector3 offset = transform.position; //3
    offset.z +=0.01f;  //3
    transform.position = offset; //3             
                 
}
     
     
WheelData SetupWheels&#40;Transform wheel, Transform bone&#41;{  //2
    WheelData result = new WheelData&#40;&#41;;
         
    GameObject go = new GameObject&#40;"Collider_"+wheel.name&#41;; //4
    go.transform.parent = transform; //5        
    go.transform.position = wheel.position; //6
    go.transform.localRotation = Quaternion.Euler&#40;0,wheel.localRotation.y,0&#41;; //7
       
    WheelCollider col = &#40;WheelCollider&#41; go.AddComponent&#40;typeof&#40;WheelCollider&#41;&#41;;//8
    WheelCollider colPref = wheelCollider.GetComponent<WheelCollider>&#40;&#41;;//9

    col.mass = colPref.mass;//10
    col.center = colPref.center;//10
    col.radius = colPref.radius;//10
    col.suspensionDistance = colPref.suspensionDistance;//10
    col.suspensionSpring = colPref.suspensionSpring;//10
    col.forwardFriction = colPref.forwardFriction;//10
    col.sidewaysFriction = colPref.sidewaysFriction;//10

    result.wheelTransform = wheel; //11
    result.boneTransform = bone; //11
    result.col = col; //11
    result.wheelStartPos = wheel.transform.localPosition; //11
    result.boneStartPos = bone.transform.localPosition; //11
    result.startWheelAngle = wheel.transform.localRotation; //11
         
    return result; //12
}
void FixedUpdate&#40;&#41;{
         
    UpdateWheels&#40;&#41;; //1  
               
     
}
 
 
public void UpdateWheels&#40;&#41;{ //1  
    float delta = Time.fixedDeltaTime;  //2
     
    float trackRpm = CalculateSmoothRpm&#40;leftTrackWheelData&#41;; //3                 
         
    foreach &#40;WheelData w in leftTrackWheelData&#41;{  //4
        w.wheelTransform.localPosition =  CalculateWheelPosition&#40;w.wheelTransform,w.col,w.wheelStartPos&#41;; //5
        w.boneTransform.localPosition = CalculateWheelPosition&#40;w.boneTransform,w.col,w.boneStartPos&#41;; //6    
         
        w.rotation = Mathf.Repeat&#40;w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f&#41;;  //7
        w.wheelTransform.localRotation = Quaternion.Euler&#40;w.rotation, w.startWheelAngle.y, w.startWheelAngle.z&#41;; //8                     
       
    }
     
     
    leftTrackTextureOffset = Mathf.Repeat&#40;leftTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f&#41;; //9
    leftTrack.renderer.material.SetTextureOffset&#40;"_MainTex",new Vector2&#40;0,-leftTrackTextureOffset&#41;&#41;; //10
     
    trackRpm = CalculateSmoothRpm&#40;rightTrackWheelData&#41;;  //3
         
    foreach &#40;WheelData w in rightTrackWheelData&#41;{  //4  
        w.wheelTransform.localPosition = CalculateWheelPosition&#40;w.wheelTransform,w.col,w.wheelStartPos&#41;; //5
        w.boneTransform.localPosition = CalculateWheelPosition&#40;w.boneTransform,w.col,w.boneStartPos&#41;; //6
                     
        w.rotation = Mathf.Repeat&#40;w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f&#41;;  //7
        w.wheelTransform.localRotation = Quaternion.Euler&#40;w.rotation, w.startWheelAngle.y, w.startWheelAngle.z&#41;;  //8
         
       
    }
             
    rightTrackTextureOffset = Mathf.Repeat&#40;rightTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f&#41;;  ///9
    rightTrack.renderer.material.SetTextureOffset&#40;"_MainTex",new Vector2&#40;0,-rightTrackTextureOffset&#41;&#41;;  //10
     
    for&#40;int i=0;i<leftTrackUpperWheels.Length;i++&#41;{  //11
        leftTrackUpperWheels[i].localRotation = Quaternion.Euler&#40;leftTrackWheelData[0].rotation, leftTrackWheelData[0].startWheelAngle.y, leftTrackWheelData[0].startWheelAngle.z&#41;;  //11
    }
     
    for&#40;int i=0;i<rightTrackUpperWheels.Length;i++&#41;{  //11
        rightTrackUpperWheels[i].localRotation = Quaternion.Euler&#40;rightTrackWheelData[0].rotation, rightTrackWheelData[0].startWheelAngle.y, rightTrackWheelData[0].startWheelAngle.z&#41;;  //11
    }
}
 
 
private float CalculateSmoothRpm&#40;WheelData[] w&#41;{ //12
    float rpm = 0.0f;  
     
    List<int> grWheelsInd = new List<int>&#40;&#41;; //13
             
    for&#40;int i = 0;i<w.Length;i++&#41;{ //14
        if&#40;w[i].col.isGrounded&#41;{  //14
            grWheelsInd.Add&#40;i&#41;; //14
        }
    }
     
    if&#40;grWheelsInd.Count == 0&#41;{  //15  
        foreach&#40;WheelData wd in w&#41;{  //15
            rpm +=wd.col.rpm;  //15                              
        }
         
        rpm /= w.Length; //15
                     
    }else{  //16
                                 
        for&#40;int i = 0;i<grWheelsInd.Count;i++&#41;{  //16
            rpm +=w[grWheelsInd[i]].col.rpm; //16        
        }
         
        rpm /= grWheelsInd.Count; //16
    }
     
    return rpm; //17
}
 
 
private Vector3 CalculateWheelPosition&#40;Transform w,WheelCollider col,Vector3 startPos&#41;{  //18
    WheelHit hit;
             
    Vector3 lp = w.localPosition;
    if &#40;col.GetGroundHit&#40;out hit&#41;&#41; {
        lp.y -= Vector3.Dot&#40;w.position - hit.point, transform.up&#41; - wheelRadius;
         
    }else {
        lp.y = startPos.y - suspensionOffset;
                     
    }
     
               
    return lp; 
               
}
       
}


Но куда добавить это, у меня возникают вопросы, помогите пожалуйста
Скрытый текст:
Синтаксис:
Используется csharp
5. Учимся ездить

public float rotateOnStandTorque = 1500.0f; //1
public float rotateOnStandBrakeTorque = 500.0f; //2
public float maxBrakeTorque = 1000.0f; //3

void FixedUpdate&#40;&#41;{
    float accelerate = 0;  
    float steer = 0;  
             
    accelerate = Input.GetAxis&#40;"Vertical"&#41;;  //4
    steer = Input.GetAxis&#40;"Horizontal"&#41;; //4
     
    UpdateWheels&#40;accelerate,steer&#41;; //5
}
 
 
public void UpdateWheels&#40;float accel,float steer&#41;{ //5
    float delta = Time.fixedDeltaTime;
     
    float trackRpm = CalculateSmoothRpm&#40;leftTrackWheelData&#41;;             
         
    foreach &#40;WheelData w in leftTrackWheelData&#41;{
        w.wheelTransform.localPosition = CalculateWheelPosition&#40;w.wheelTransform,w.col,w.wheelStartPos&#41;;
        w.boneTransform.localPosition = CalculateWheelPosition&#40;w.boneTransform,w.col,w.boneStartPos&#41;;
         
        w.rotation = Mathf.Repeat&#40;w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f&#41;;
        w.wheelTransform.localRotation = Quaternion.Euler&#40;w.rotation, w.startWheelAngle.y, w.startWheelAngle.z&#41;;
         
        CalculateMotorForce&#40;w.col,accel,steer&#41;;  //6
    }
     
     
    leftTrackTextureOffset = Mathf.Repeat&#40;leftTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f&#41;;
    leftTrack.renderer.material.SetTextureOffset&#40;"_MainTex",new Vector2&#40;0,-leftTrackTextureOffset&#41;&#41;;
     
    trackRpm = CalculateSmoothRpm&#40;rightTrackWheelData&#41;;
         
    foreach &#40;WheelData w in rightTrackWheelData&#41;{
        w.wheelTransform.localPosition = CalculateWheelPosition&#40;w.wheelTransform,w.col,w.wheelStartPos&#41;;
        w.boneTransform.localPosition = CalculateWheelPosition&#40;w.boneTransform,w.col,w.boneStartPos&#41;;
                     
        w.rotation = Mathf.Repeat&#40;w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f&#41;;
        w.wheelTransform.localRotation = Quaternion.Euler&#40;w.rotation, w.startWheelAngle.y, w.startWheelAngle.z&#41;;
         
        CalculateMotorForce&#40;w.col,accel,-steer&#41;; //6
    }
             
    rightTrackTextureOffset = Mathf.Repeat&#40;rightTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f&#41;;
    rightTrack.renderer.material.SetTextureOffset&#40;"_MainTex",new Vector2&#40;0,-rightTrackTextureOffset&#41;&#41;;
     
    for&#40;int i=0;i<leftTrackUpperWheels.Length;i++&#41;{
        leftTrackUpperWheels[i].localRotation = Quaternion.Euler&#40;leftTrackWheelData[0].rotation, leftTrackWheelData[0].startWheelAngle.y, leftTrackWheelData[0].startWheelAngle.z&#41;;
    }
     
    for&#40;int i=0;i<rightTrackUpperWheels.Length;i++&#41;{
        rightTrackUpperWheels[i].localRotation = Quaternion.Euler&#40;rightTrackWheelData[0].rotation, rightTrackWheelData[0].startWheelAngle.y, rightTrackWheelData[0].startWheelAngle.z&#41;;
    }
}


public void CalculateMotorForce&#40;WheelCollider col, float accel, float steer&#41;{  //6
     if&#40;accel == 0 && steer == 0&#41;{ //7
        col.brakeTorque = maxBrakeTorque; //7
    }else if&#40;accel == 0.0f&#41;{  //8
        col.brakeTorque = rotateOnStandBrakeTorque; //9
        col.motorTorque = steer*rotateOnStandTorque; //10
    }
             
}

О чудо наш танк сошел с ума и теперь может крутиться со скоростью волчка, да еще и ездить боком, все правильно, теперь бокового трения нету совсем. Теперь выйдите из Play mode, поставьте значение в 0.06 и снова нажмите Play. Ну наконец то, теперь наш танк поворачивается вокруг своей оси и вполне адекватно. Выходите из Play mode и установите значение Sideways Friction обратно в 1. Конечно все это хорошо менять значение прямо из префаба, но лучше это делать из скрипта, потомучто когда боковое трение не управляемо есть шанс что наш танк будет входить в самый настоящий дрифт. Заодно научим танк ехать вперед и поворачивать во время движения. Модифицируем функцию CalculateMotorForce&#40;&#41; и объявим еще маленько глобальных переменных:
public float forwardTorque = 500.0f; //1
public float rotateOnMoveBrakeTorque = 400.0f; //2
public float minBrakeTorque = 0.0f; //3
public float minOnStayStiffness = 0.06f; //4
public float minOnMoveStiffness = 0.05f;  //5
public float rotateOnMoveMultiply = 2.0f; //6

public void CalculateMotorForce&#40;WheelCollider col, float accel, float steer&#41;{
    WheelFrictionCurve fc = col.sidewaysFriction;  //7
             
    if&#40;accel == 0 && steer == 0&#41;{
        col.brakeTorque = maxBrakeTorque;
    }else if&#40;accel == 0.0f&#41;{
        col.brakeTorque = rotateOnStandBrakeTorque;
        col.motorTorque = steer*rotateOnStandTorque;     
        fc.stiffness = 1.0f + minOnStayStiffness - Mathf.Abs&#40;steer&#41;;
         
    }else{ //8
         
        col.brakeTorque = minBrakeTorque;  //9
        col.motorTorque = accel*forwardTorque;  //10
                     
        if&#40;steer < 0&#41;{ //11
            col.brakeTorque = rotateOnMoveBrakeTorque; //12
            col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//13
            fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs&#40;steer&#41;;  //14
        }
         
        if&#40;steer > 0&#41;{ //15
             
            col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//16
            fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs&#40;steer&#41;; //17
        }
         
                     
    }
     
    if&#40;fc.stiffness > 1.0f&#41;fc.stiffness = 1.0f; //18             
    col.sidewaysFriction = fc; //19
     
    if&#40;col.rpm > 0 && accel < 0&#41;{ //20
        col.brakeTorque = maxBrakeTorque;  //21
    }else if&#40;col.rpm < 0 && accel > 0&#41;{ //22
        col.brakeTorque = maxBrakeTorque; //23
    }
}
 
md.kostya
UNец
 
Сообщения: 14
Зарегистрирован: 06 авг 2013, 19:27

Re: Unity3d Tank Tutorial

Сообщение md.kostya 07 авг 2013, 12:50

чуток поковыряв собрал до кучи, может кому надо)
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; //1

public class TankTrackController : MonoBehaviour {
   
    public GameObject wheelCollider; //2
   
    public float wheelRadius = 0.15f; //3
    public float suspensionOffset = 0.05f; //4
       
    public float trackTextureSpeed = 2.5f; //5
       
    public GameObject leftTrack;  //6
    public Transform[] leftTrackUpperWheels; //7
    public Transform[] leftTrackWheels; //8
    public Transform[] leftTrackBones; //9
   
    public GameObject rightTrack; //6
    public Transform[] rightTrackUpperWheels; //7
    public Transform[] rightTrackWheels; //8
    public Transform[] rightTrackBones; //9
   
    public class WheelData { //10
        public Transform wheelTransform; //11
        public Transform boneTransform; //12
        public WheelCollider col; //13
        public Vector3 wheelStartPos; //14
        public Vector3 boneStartPos; //15
        public float rotation = 0.0f; //16
        public Quaternion startWheelAngle;      //17
               
               
    }
   
    protected WheelData[] leftTrackWheelData; //18
    protected WheelData[] rightTrackWheelData; //18
   
    protected float leftTrackTextureOffset = 0.0f; //19
    protected float rightTrackTextureOffset = 0.0f; //19
       
        void Awake() {
                 
    leftTrackWheelData = new WheelData[leftTrackWheels.Length]; //1
    rightTrackWheelData = new WheelData[rightTrackWheels.Length]; //1
             
    for(int i=0;i<leftTrackWheels.Length;i++){
        leftTrackWheelData[i] = SetupWheels(leftTrackWheels[i],leftTrackBones[i]);  //2
    }
         
    for(int i=0;i<rightTrackWheels.Length;i++){
        rightTrackWheelData[i] = SetupWheels(rightTrackWheels[i],rightTrackBones[i]); //2  
    }

    Vector3 offset = transform.position; //3
    offset.z +=0.01f;  //3
    transform.position = offset; //3             
                 
}
     
     
WheelData SetupWheels(Transform wheel, Transform bone){  //2
    WheelData result = new WheelData();
         
    GameObject go = new GameObject("Collider_"+wheel.name); //4
    go.transform.parent = transform; //5        
    go.transform.position = wheel.position; //6
    go.transform.localRotation = Quaternion.Euler(0,wheel.localRotation.y,0); //7
       
    WheelCollider col = (WheelCollider) go.AddComponent(typeof(WheelCollider));//8
    WheelCollider colPref = wheelCollider.GetComponent<WheelCollider>();//9

    col.mass = colPref.mass;//10
    col.center = colPref.center;//10
    col.radius = colPref.radius;//10
    col.suspensionDistance = colPref.suspensionDistance;//10
    col.suspensionSpring = colPref.suspensionSpring;//10
    col.forwardFriction = colPref.forwardFriction;//10
    col.sidewaysFriction = colPref.sidewaysFriction;//10

    result.wheelTransform = wheel; //11
    result.boneTransform = bone; //11
    result.col = col; //11
    result.wheelStartPos = wheel.transform.localPosition; //11
    result.boneStartPos = bone.transform.localPosition; //11
    result.startWheelAngle = wheel.transform.localRotation; //11
         
    return result; //12
   
}
void FixedUpdate(){
               
        float accelerate = 0;  
    float steer = 0;  
             
    accelerate = Input.GetAxis("Vertical");  //4
    steer = Input.GetAxis("Horizontal"); //4
         
    UpdateWheels(accelerate,steer); //1  
     
}
 
    public float rotateOnStandTorque = 1500.0f; //1
    public float rotateOnStandBrakeTorque = 500.0f; //2
        public float maxBrakeTorque = 1000.0f; //3
        public float forwardTorque = 500.0f; //1
        public float rotateOnMoveBrakeTorque = 400.0f; //2
        public float minBrakeTorque = 0.0f; //3
        public float minOnStayStiffness = 0.06f; //4
        public float minOnMoveStiffness = 0.05f;  //5
        public float rotateOnMoveMultiply = 2.0f; //6
       
        public void UpdateWheels(float accel,float steer){ //5
    float delta = Time.fixedDeltaTime;
     
    float trackRpm = CalculateSmoothRpm(leftTrackWheelData);             
         
    foreach (WheelData w in leftTrackWheelData){
        w.wheelTransform.localPosition = CalculateWheelPosition(w.wheelTransform,w.col,w.wheelStartPos);
        w.boneTransform.localPosition = CalculateWheelPosition(w.boneTransform,w.col,w.boneStartPos);
         
        w.rotation = Mathf.Repeat(w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f);
        w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.startWheelAngle.y, w.startWheelAngle.z);
         
        CalculateMotorForce(w.col,accel,steer);  //6
    }
     
     
    leftTrackTextureOffset = Mathf.Repeat(leftTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f);
    leftTrack.renderer.material.SetTextureOffset("_MainTex",new Vector2(0,-leftTrackTextureOffset));
     
    trackRpm = CalculateSmoothRpm(rightTrackWheelData);
         
    foreach (WheelData w in rightTrackWheelData){
        w.wheelTransform.localPosition = CalculateWheelPosition(w.wheelTransform,w.col,w.wheelStartPos);
        w.boneTransform.localPosition = CalculateWheelPosition(w.boneTransform,w.col,w.boneStartPos);
                     
        w.rotation = Mathf.Repeat(w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f);
        w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.startWheelAngle.y, w.startWheelAngle.z);
         
        CalculateMotorForce(w.col,accel,-steer); //6
    }
             
    rightTrackTextureOffset = Mathf.Repeat(rightTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f);
    rightTrack.renderer.material.SetTextureOffset("_MainTex",new Vector2(0,-rightTrackTextureOffset));
     
    for(int i=0;i<leftTrackUpperWheels.Length;i++){
        leftTrackUpperWheels[i].localRotation = Quaternion.Euler(leftTrackWheelData[0].rotation, leftTrackWheelData[0].startWheelAngle.y, leftTrackWheelData[0].startWheelAngle.z);
    }
     
    for(int i=0;i<rightTrackUpperWheels.Length;i++){
        rightTrackUpperWheels[i].localRotation = Quaternion.Euler(rightTrackWheelData[0].rotation, rightTrackWheelData[0].startWheelAngle.y, rightTrackWheelData[0].startWheelAngle.z);
    }
}


public void CalculateMotorForce(WheelCollider col, float accel, float steer){  //6
     WheelFrictionCurve fc = col.sidewaysFriction;  //7
             
    if(accel == 0 && steer == 0){
        col.brakeTorque = maxBrakeTorque;
    }else if(accel == 0.0f){
        col.brakeTorque = rotateOnStandBrakeTorque;
        col.motorTorque = steer*rotateOnStandTorque;     
        fc.stiffness = 1.0f + minOnStayStiffness - Mathf.Abs(steer);
         
    }else{ //8
         
        col.brakeTorque = minBrakeTorque;  //9
        col.motorTorque = accel*forwardTorque;  //10
                     
        if(steer < 0){ //11
            col.brakeTorque = rotateOnMoveBrakeTorque; //12
            col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//13
            fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs(steer);  //14
        }
         
        if(steer > 0){ //15
             
            col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//16
            fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs(steer); //17
        }
         
                     
    }
     
    if(fc.stiffness > 1.0f)fc.stiffness = 1.0f; //18             
    col.sidewaysFriction = fc; //19
     
    if(col.rpm > 0 && accel < 0){ //20
        col.brakeTorque = maxBrakeTorque;  //21
    }else if(col.rpm < 0 && accel > 0){ //22
        col.brakeTorque = maxBrakeTorque; //23
    }
}
 
private float CalculateSmoothRpm(WheelData[] w){ //12
    float rpm = 0.0f;  
     
    List<int> grWheelsInd = new List<int>(); //13
             
    for(int i = 0;i<w.Length;i++){ //14
        if(w[i].col.isGrounded){  //14
            grWheelsInd.Add(i); //14
        }
    }
     
    if(grWheelsInd.Count == 0){  //15  
        foreach(WheelData wd in w){  //15
            rpm +=wd.col.rpm;  //15                              
        }
         
        rpm /= w.Length; //15
                     
    }else{  //16
                                 
        for(int i = 0;i<grWheelsInd.Count;i++){  //16
            rpm +=w[grWheelsInd[i]].col.rpm; //16        
        }
         
        rpm /= grWheelsInd.Count; //16
    }
     
    return rpm; //17
}
 
 
private Vector3 CalculateWheelPosition(Transform w,WheelCollider col,Vector3 startPos){  //18
    WheelHit hit;
             
    Vector3 lp = w.localPosition;
    if (col.GetGroundHit(out hit)) {
        lp.y -= Vector3.Dot(w.position - hit.point, transform.up) - wheelRadius;
         
    }else {
        lp.y = startPos.y - suspensionOffset;
                     
    }
     
    return lp;           
}      
}
md.kostya
UNец
 
Сообщения: 14
Зарегистрирован: 06 авг 2013, 19:27

Re: Unity3d Tank Tutorial

Сообщение NikoBellic 20 авг 2013, 15:48

IDoNotExist писал(а): я вот тут сейчас хочу сделать контроллер который будет рассчитывать коллизии по всей длине гусеницы, естественно это будет требовать гораздо больше вычислений, но это же физика всетаки, а она всегда требует больших вычислений.

Когда прочитал Ваш урок, тоже очень заинтересовался в этом способе, но сам не смогу его реализовать, потому что я нуб :)
Я хотел бы спросить у автора, как у него продвигается разработка такого реалистичного контроллера? Повторюсь, я очень заинтересован в этой технологии.
P.S. Если кто-то хочет поинтересоваться, зачем нубу этот способ просчитывания коллизий по всей длине гусеницы, я отошлю ссылку на свой проект. Надеюсь, здесь это правилами не запрещено.
NikoBellic
UNец
 
Сообщения: 41
Зарегистрирован: 16 авг 2013, 20:08

Re: Unity3d Tank Tutorial

Сообщение IDoNotExist 23 авг 2013, 15:10

NikoBellic писал(а):
IDoNotExist писал(а): я вот тут сейчас хочу сделать контроллер который будет рассчитывать коллизии по всей длине гусеницы, естественно это будет требовать гораздо больше вычислений, но это же физика всетаки, а она всегда требует больших вычислений.

Когда прочитал Ваш урок, тоже очень заинтересовался в этом способе, но сам не смогу его реализовать, потому что я нуб :)
Я хотел бы спросить у автора, как у него продвигается разработка такого реалистичного контроллера? Повторюсь, я очень заинтересован в этой технологии.
P.S. Если кто-то хочет поинтересоваться, зачем нубу этот способ просчитывания коллизий по всей длине гусеницы, я отошлю ссылку на свой проект. Надеюсь, здесь это правилами не запрещено.

Я пришел к выводу что это довольно глупая затея, в последнем варианте физики танка я использовал свой коллайдер колес на основе SphereCast, получилось довольно хорошо, но если на сцене большое количество танков, производительность оставляет желать лучшего.

Если вам нужен физически реалистичный танк, то присмотритесь к этому https://www.assetstore.unity3d.com/#/content/8974, там гусеница на джоинтах насколько я понимаю, а значит масштабные танковые сражения тоже сделать не получится.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Unity3d Tank Tutorial

Сообщение ASD 11 сен 2013, 16:33

Де-то я встречал туториал или статейку, в котором гусеница набиралась из отдельных траков, но двигались все эти траки по определённой кривой. Получалось одновременно и реалистично, и довольно быстро. Кстати, я иногда, когда время есть, дорабатываю туториал с этого топика, танк довольно реалистично ездит, крутит башней, стреляет и т.д. Может когда поубираю баги и доделаю ещё несколько фич - выложу
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Unity3d Tank Tutorial

Сообщение NikoBellic 15 сен 2013, 14:01

ASD писал(а):Де-то я встречал туториал или статейку, в котором гусеница набиралась из отдельных траков, но двигались все эти траки по определённой кривой. Получалось одновременно и реалистично, и довольно быстро. Кстати, я иногда, когда время есть, дорабатываю туториал с этого топика, танк довольно реалистично ездит, крутит башней, стреляет и т.д. Может когда поубираю баги и доделаю ещё несколько фич - выложу

Было бы неплохо, я бы смог улучшить свой проект с помощью этого) А то хочется побольше реалистичности, да руки не из того места растут, чтобы изобретать. Во всяком случае, пока :)
NikoBellic
UNец
 
Сообщения: 41
Зарегистрирован: 16 авг 2013, 20:08

Re: Unity3d Tank Tutorial

Сообщение ASD 16 сен 2013, 09:14

Туториал из этой темы и так довольно реалистично выглядит, мне кажется нет смысла заморачиваться, потому как потом всё равно придётся переделывать в сторону упрощения, или скорее всего этот "проект" не выйдет дальше чем "кое-как ездящий танк" :)
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Unity3d Tank Tutorial

Сообщение NikoBellic 16 сен 2013, 16:44

ASD писал(а):Туториал из этой темы и так довольно реалистично выглядит, мне кажется нет смысла заморачиваться, потому как потом всё равно придётся переделывать в сторону упрощения, или скорее всего этот "проект" не выйдет дальше чем "кое-как ездящий танк" :)

Посмотрим, на сколько меня хватит ;)
NikoBellic
UNец
 
Сообщения: 41
Зарегистрирован: 16 авг 2013, 20:08

Re: Unity3d Tank Tutorial

Сообщение dezertir 23 ноя 2013, 20:37

Сделал все как в туторе - танк с места встает на дыбы, летает как ужаленный. версия юнити 4,3free. Подскажите, в чем может быть беда?
dezertir
UNец
 
Сообщения: 1
Зарегистрирован: 22 ноя 2013, 05:01

Пред.След.

Вернуться в Уроки

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2