unity3D网络游戏实战之坦克单元
2018-03-30 16:46
351 查看
之前学的是建模,用C#编写游戏刚入门,也有很多小错误,和最开始写c是一样的,很多看着书都能敲错,所以把小错误记下来。
1.对坦克进行上下左右控制。应该写成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);
}
}
最后运行游戏轮子和履带不转动,不知道什么原因。。。
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; } } }
最后运行游戏轮子和履带不转动,不知道什么原因。。。
相关文章推荐
- 《Unity3D网络游戏实战》学习笔记--Unity3D软件安装之error:CS0246The type or namespace name 'PostEffectsBase' could not
- 在Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- 使用Unity3D开发网络游戏
- unity3D实际的原始视频游戏开发系列讲座12之U3D的2D为了开发实战的新方法
- unity3d-游戏实战突出重围,整合游戏
- Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D的网络游戏中实现资源动态加载
- unity3d-游戏实战突出重围,第四天 添加角色
- Unity3d 蓝牙IOS 点对点网络游戏
- 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (五)之实时排名系统
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D游戏引擎实战开发从入门到精通
- 在Unity3D的网络游戏中实现资源动态加载
- 【Unity3D实战】零基础一步一步教你制作酷跑类游戏(1)
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3d网络游戏Socket通讯
- Unity3d多人游戏与网络功能(四)-状态机同步与远程动作