您的位置:首页 > 理论基础 > 计算机网络

unity3D网络游戏实战之坦克单元

2018-03-30 16:46 351 查看
      之前学的是建模,用C#编写游戏刚入门,也有很多小错误,和最开始写c是一样的,很多看着书都能敲错,所以把小错误记下来。

1.对坦克进行上下左右控制。应该写成Tank结果把名字小写了,导致很长时间没看出来
void Start()
{
target = GameObject.Find("Tank");
}

2.在写完程序后一定要先运行,先在VS中运行了,才能在unity中实现相应操作3.控制坦克的移动这段程序我们要把C#托在Tank上才能实现
控制炮管、炮塔:using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Tank : MonoBehaviour
{
public Transform turret;
public Transform gun;
private float turretRotSpeed = 0.5f;
private float turretRotTarget = 0;
private float maxRoll = 10f;
private float minRoll = -4f;
private float turretRollTarget = 0;
void Start()
{
turret = transform.FindChild("turret");
gun = turret.FindChild("gun");
}
private void Update()
{
float steer = 20;
float x = Input.GetAxis("Horizontal");
transform.Rotate(0, x * steer * Time.deltaTime, 0);
float speed = 3f;
float y = Input.GetAxis("Vertical");
Vector3 s = y * transform.forward * speed * Time.deltaTime;
transform.transform.position += s;
TurretRotation();
turretRotTarget = Camera.main.transform.eulerAngles.y;
turretRollTarget = Camera.main.transform.eulerAngles.x;
TurretRoll();

}
//炮塔旋转
public void TurretRotation()
{
if (Camera.main == null)
return;
if (turret == null)
return;

//归一化角度
float angle = turret.eulerAngles.y - turretRotTarget;
if (angle < 0) angle += 360;

if (angle > turretRotSpeed && angle < 180)
turret.Rotate(0f, -turretRotSpeed, 0f);
else if (angle > 180 && angle < 360 - turretRotSpeed)
turret.Rotate(0f, turretRotSpeed, 0f);
}
public void TurretRoll()
{
if (Camera.main == null)
return;
if (turret == null)
return;
//获取角度
Vector3 worldEuler = gun.eulerAngles;
Vector3 localEuler = gun.localEulerAngles;
//世界坐标系角度计算
worldEuler.x = turretRollTarget;
gun.eulerAngles = worldEuler;
//本地坐标系角度限制
Vector3 euler = gun.localEulerAngles;
if (euler.x > 180)
euler.x -= 360;

if (euler.x > maxRoll)
euler.x = maxRoll;
if (euler.x < minRoll)
euler.x = minRoll;
gun.localEulerAngles = new Vector3(euler.x, localEuler.y, localEuler.z);
}
}在进行加车轮的过程中,看了原代码把控制坦克行走的部分删除了,但结果又要求行走,由于一时没想到就把代码全删了,后来又从新写了一遍,之前有点没理解。说之前的两种方法可以删除了,不知到说的哪俩种,导致都删了。红色部分不能删using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Tank : MonoBehaviour
{
public Transform turret;
public Transform gun;
private float turretRotSpeed = 0.5f;
private float turretRotTarget = 0;
private float maxRoll = 10f;
private float minRoll = -4f;
private float turretRollTarget = 0;
public List<AxleInfo> axleInfos;
//马力/最大马力
private float motor = 0;
public float maxMotorTorque;
//制动/最大制动
private float brakeTorque = 0;
public float maxBrakeTorque = 100;
//转向角/最大转向角
private float steering = 0;
public float maxSteeringAngle;
void Start()
{
turret = transform.FindChild("turret");
gun = turret.FindChild("gun");
}
private void Update()
{
float steer = 20;
float x = Input.GetAxis("Horizontal");
transform.Rotate(0, x * steer * Time.deltaTime, 0);
float speed = 3f;
float y = Input.GetAxis("Vertical");
Vector3 s = y * transform.forward * speed * Time.deltaTime;
transform.transform.position += s;

turretRotTarget = Camera.main.transform.eulerAngles.y;
turretRollTarget = Camera.main.transform.eulerAngles.x;

PlayerCtrl();
foreach (AxleInfo axleInfo in axleInfos)
{
//转向
if (axleInfo.steering)
{
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
//马力
if (axleInfo.motor)
{
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
//制动
if (true)
{
axleInfo.leftWheel.brakeTorque = brakeTorque;
axleInfo.rightWheel.brakeTorque = brakeTorque;
}

}

//炮塔炮管旋转
TurretRotation();
TurretRoll();

}
public void PlayerCtrl()
{
//马力和转向角
motor = maxMotorTorque * Input.GetAxis("Vertical");
steering = maxSteeringAngle * Input.GetAxis("Horizontal");
//炮塔炮管角度
turretRotTarget = Camera.main.transform.eulerAngles.y;
turretRollTarget = Camera.main.transform.eulerAngles.x;
}

//炮塔旋转
public void TurretRotation()
{
if (Camera.main == null)
return;
if (turret == null)
return;

//归一化角度
float angle = turret.eulerAngles.y - turretRotTarget;
if (angle < 0) angle += 360;

if (angle > turretRotSpeed && angle < 180)
turret.Rotate(0f, -turretRotSpeed, 0f);
else if (angle > 180 && angle < 360 - turretRotSpeed)
turret.Rotate(0f, turretRotSpeed, 0f);
}
public void TurretRoll()
{
if (Camera.main == null)
return;
if (turret == null)
return;
//获取角度
Vector3 worldEuler = gun.eulerAngles;
Vector3 localEuler = gun.localEulerAngles;
//世界坐标系角度计算
worldEuler.x = turretRollTarget;
gun.eulerAngles = worldEuler;
//本地坐标系角度限制
Vector3 euler = gun.localEulerAngles;
if (euler.x > 180)
euler.x -= 360;

if (euler.x > maxRoll)
euler.x = maxRoll;
if (euler.x < minRoll)
euler.x = minRoll;
gun.localEulerAngles = new Vector3(euler.x, localEuler.y, localEuler.z);
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Tank : MonoBehaviour
{
public Transform turret;
public Transform gun;
private Transform wheels;
private Transform tracks;
private float turretRotSpeed = 0.5f;
private float turretRotTarget = 0;
private float maxRoll = 10f;
private float minRoll = -4f;
private float turretRollTarget = 0;
public List<AxleInfo> axleInfos;
//马力/最大马力
private float motor = 0;
public float maxMotorTorque;
//制动/最大制动
private float brakeTorque = 0;
public float maxBrakeTorque = 100;
//转向角/最大转向角
private float steering = 0;
public float maxSteeringAngle;
void Start()
{
turret = transform.FindChild("turret");
gun = turret.FindChild("gun");
wheels = transform.FindChild("wheel");
}
private void Update()
{
float steer = 20;
float x = Input.GetAxis("Horizontal");
transform.Rotate(0, x * steer * Time.deltaTime, 0);
float speed = 3f;
float y = Input.GetAxis("Vertical");
Vector3 s = y * transform.forward * speed * Time.deltaTime;
transform.transform.position += s;

turretRotTarget = Camera.main.transform.eulerAngles.y;
turretRollTarget = Camera.main.transform.eulerAngles.x;

PlayerCtrl();
foreach (AxleInfo axleInfo in axleInfos)
{
//转向
if (axleInfo.steering)
{
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
//马力
if (axleInfo.motor)
{
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
//制动
if (true)
{
axleInfo.leftWheel.brakeTorque = brakeTorque;
axleInfo.rightWheel.brakeTorque = brakeTorque;
}

}

//炮塔炮管旋转
TurretRotation();
TurretRoll();

}
public void PlayerCtrl()
{
//马力和转向角
motor = maxMotorTorque * Input.GetAxis("Vertical"
b655
);
steering = maxSteeringAngle * Input.GetAxis("Horizontal");
//制动
brakeTorque = 0;
foreach (AxleInfo axleInfo in axleInfos)
{
if (axleInfo.leftWheel.rpm > 5 && motor < 0)  //前进时,按下“下”键
brakeTorque = maxBrakeTorque;
else if (axleInfo.leftWheel.rpm < -5 && motor > 0)  //后退时,按下“上”键
brakeTorque = maxBrakeTorque;
continue;
}
//炮塔炮管角度
turretRotTarget = Camera.main.transform.eulerAngles.y;
turretRollTarget = Camera.main.transform.eulerAngles.x;
}

//炮塔旋转
public void TurretRotation()
{
if (Camera.main == null)
return;
if (turret == null)
return;

//归一化角度
float angle = turret.eulerAngles.y - turretRotTarget;
if (angle < 0) angle += 360;

if (angle > turretRotSpeed && angle < 180)
turret.Rotate(0f, -turretRotSpeed, 0f);
else if (angle > 180 && angle < 360 - turretRotSpeed)
turret.Rotate(0f, turretRotSpeed, 0f);
}
public void TurretRoll()
{
if (Camera.main == null)
return;
if (turret == null)
return;
//获取角度
Vector3 worldEuler = gun.eulerAngles;
Vector3 localEuler = gun.localEulerAngles;
//世界坐标系角度计算
worldEuler.x = turretRollTarget;
gun.eulerAngles = worldEuler;
//本地坐标系角度限制
Vector3 euler = gun.localEulerAngles;
if (euler.x > 180)
euler.x -= 360;

if (euler.x > maxRoll)
euler.x = maxRoll;
if (euler.x < minRoll)
euler.x = minRoll;
gun.localEulerAngles = new Vector3(euler.x, localEuler.y, localEuler.z);
}
//轮子旋转
public void WheelsRotation(WheelCollider collider)
{
if (wheels == null)
return;
//获取旋转信息
Vector3 position;
Quaternion rotation;
collider.GetWorldPose(out position, out rotation);
//旋转每个轮子
foreach (Transform wheel in wheels)
{
wheel.rotation = rotation;
}
}
}

最后运行游戏轮子和履带不转动,不知道什么原因。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息