经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
Extreme Drift赛车游戏C#源码详解(2)
来源:cnblogs  作者:一清  时间:2018/11/28 9:58:52  对本文有异议

Extreme Drift赛车游戏C#源码详解(1)

 

接着上次的源码分析:

MainMenu场景的UGUI部分:

Canvas中的EnoughMoney:

作用:当买车后金币不足弹出的页面

内部一个Text和一个Button,让我有点疑惑的是,Button绑定的点击事件是BuyVehicle函数:

  1. public void BuyVehicle()
  2. {
  3. //金币足够或者车辆未买才会执行
  4. if ((gameScore >= vehicleSetting[currentVehicleNumber].price) && !vehicleSetting[currentVehicleNumber].Bought)
  5. {
  6. //数据持久化
  7. PlayerPrefs.SetInt("BoughtVehicle" + currentVehicleNumber.ToString(), 1);
  8. //减钱
  9. gameScore -= vehicleSetting[currentVehicleNumber].price;
  10. //防止负数
  11. if (gameScore <= 0) { gameScore = 1; }
  12. //保存金币数量
  13. PlayerPrefs.SetInt("GameScore", gameScore);
  14. //保存车辆购买状态
  15. vehicleSetting[currentVehicleNumber].Bought = true;
  16. }
  17. else
  18. {
  19. menuPanels.EnoughMoney.SetActive(true);
  20. }
  21. }

 

下一个对象LevelChooser:

内含三个对象,Top,Bottom,Levels:

Top:带有OutlineLogo的简单的Text

Bottom:内含Back和Start,返回上一个场景,原理是传入一个索引值,函数如下

  1. public void CurrentPanel(int current)
  2. {
  3. //这里为什么要传一个INT呢?因为开头有定义
  4. //public enum Panels { MainMenu = 0, SelectVehicle = 1, SelectLevel = 2, Settings = 3 }
  5. //activePanel默认为0,这里传入的是1,就是选车
  6. activePanel = (Panels)current;
  7. //PlayerPrefs是数据持久化,从存档取出数据验证
  8. if (currentVehicleNumber != PlayerPrefs.GetInt("CurrentVehicle"))
  9. {
  10. currentVehicleNumber = PlayerPrefs.GetInt("CurrentVehicle");
  11. //循环所有的车辆
  12. foreach (VehicleSetting VSetting in vehicleSetting)
  13. {
  14. //当前车激活状态,否则不激活
  15. if (VSetting == vehicleSetting[currentVehicleNumber])
  16. {
  17. VSetting.vehicle.SetActive(true);
  18. currentVehicle = VSetting;
  19. }
  20. else
  21. {
  22. VSetting.vehicle.SetActive(false);
  23. }
  24. }
  25. }
  26. //根据传入值做一些操作
  27. switch (activePanel)
  28. {
  29. case Panels.MainMenu:
  30. menuPanels.MainMenu.SetActive(true);
  31. menuPanels.SelectVehicle.SetActive(false);
  32. menuPanels.SelectLevel.SetActive(false);
  33. if (menuGUI.wheelColor) menuGUI.wheelColor.gameObject.SetActive(true);
  34. break;
  35. case Panels.SelectVehicle:
  36. menuPanels.MainMenu.gameObject.SetActive(false);
  37. menuPanels.SelectVehicle.SetActive(true);
  38. menuPanels.SelectLevel.SetActive(false);
  39. break;
  40. case Panels.SelectLevel:
  41. menuPanels.MainMenu.SetActive(false);
  42. menuPanels.SelectVehicle.SetActive(false);
  43. menuPanels.SelectLevel.SetActive(true);
  44. break;
  45. case Panels.Settings:
  46. menuPanels.MainMenu.SetActive(false);
  47. menuPanels.SelectVehicle.SetActive(false); menuPanels.EnoughMoney.SetActive(true);
  48. menuPanels.SelectLevel.SetActive(false);
  49. break;
  50. }
  51. }

Start对应的函数如下:调用StartGame,然后调用下面的两个函数

  1. public void StartGame()
  2. {
  3. //防止出错
  4. if (startingGame) return;
  5. //设置背景
  6. FadeBackGround.SetBool("FadeOut", true);
  7. //调用协程加载(由于不能直接调用C#的多线程,这个函数实现多线程)
  8. StartCoroutine(LoadLevelGame(1.5f));
  9. startingGame = true;
  10. }
  11. IEnumerator LoadLevelGame(float waitTime)
  12. {
  13. yield return new WaitForSeconds(waitTime);
  14. //激活加载页面
  15. menuGUI.loading.SetActive(true);
  16. //加载
  17. StartCoroutine(LoadLevelAsync());
  18. }
  19. IEnumerator LoadLevelAsync()
  20. {
  21. yield return new WaitForSeconds(0.4f);
  22. sceneLoadingOperation = Application.LoadLevelAsync(currentLevelNumber + 1);
  23. sceneLoadingOperation.allowSceneActivation = false;
  24. while (!sceneLoadingOperation.isDone || sceneLoadingOperation.progress < 0.9f)
  25. {
  26. menuLoadTime += Time.deltaTime;
  27. yield return 0;
  28. }
  29. }

 

Levels是一个带有Scroll Rect的Image,内含Group,下有五张地图对象

每一个地图下有star1,star2,star3,简单的Image表实获取到的成绩,以及一个locked表示是否解锁,本质是一个简单的Image

还有一个CurrentLevel对象,简单的Image背景,里面有两个简单的Text表示曾经获取的成绩

每一张地图对象只是一个图片,并不实际含有地图,并且绑定一个函数,根据传参进行下一步:

  1. public void currentLevel(int current)
  2. {
  3. for (int i = 0; i < levelSetting.Length; i++)
  4. {
  5. if (i == current)
  6. {
  7. currentLevelNumber = current;
  8. levelSetting[i].panel.image.color = Color.white;
  9. levelSetting[i].panel.enabled = true;
  10. levelSetting[i].lockImage.gameObject.SetActive(false);
  11. PlayerPrefs.SetInt("CurrentLevelNumber", currentLevelNumber);
  12. }
  13. else if (levelSetting[i].locked == false)
  14. {
  15. levelSetting[i].panel.image.color = new Color(0.3f, 0.3f, 0.3f);
  16. levelSetting[i].panel.enabled = true;
  17. levelSetting[i].lockImage.gameObject.SetActive(false);
  18. }
  19. else
  20. {
  21. levelSetting[i].panel.image.color = new Color(1.0f, 0.5f, 0.5f);
  22. levelSetting[i].panel.enabled = false;
  23. levelSetting[i].lockImage.gameObject.SetActive(true);
  24. }
  25. //根据保存过的信息进行显示
  26. if (levelSetting[i].bestTime)
  27. {
  28. if (PlayerPrefs.GetFloat("BestTime" + (i + 1).ToString()) != 0.0f)
  29. {
  30. if (PlayerPrefs.GetInt("LevelStar" + (i + 1)) == 1)
  31. {
  32. levelSetting[i].stars.Star1.color = Color.white;
  33. }
  34. else if (PlayerPrefs.GetInt("LevelStar" + (i + 1)) == 2)
  35. {
  36. levelSetting[i].stars.Star1.color = Color.white;
  37. levelSetting[i].stars.Star2.color = Color.white;
  38. }
  39. else if (PlayerPrefs.GetInt("LevelStar" + (i + 1)) == 3)
  40. {
  41. levelSetting[i].stars.Star1.color = Color.white;
  42. levelSetting[i].stars.Star2.color = Color.white;
  43. levelSetting[i].stars.Star3.color = Color.white;
  44. }
  45. levelSetting[i].bestTime.text = "BEST : " + GetComponent<FormatSecondsScript>().FormatSeconds(PlayerPrefs.GetFloat("BestTime" + (i + 1))).ToString();
  46. }
  47. }
  48. }
  49. }

 

下一个选项,Settings:设置界面

一个深色的BackGround

SettingsPanel:下面有七个对象

close是一个简单的Button,绑定MainMenu的函数:

  1. public void SettingActive(bool activePanel)
  2. {
  3. menuPanels.Settings.gameObject.SetActive(activePanel);
  4. }

Quality下有四个Button,用于设置画质,一个line用来分割,绑定的函数如下:

直接调用系统画质API,然后持久化保存数据

  1. public void QualitySetting(int quality)
  2. {
  3. QualitySettings.SetQualityLevel(quality - 1, true);
  4. PlayerPrefs.SetInt("QualitySettings", quality);
  5. }

 

Sound音量设置下是两个Toggle:选项框绑定函数:设置后保存

  1. public void DisableAudioButton(Toggle toggle)
  2. {
  3. if (toggle.isOn)
  4. {
  5. AudioListener.volume = 1;
  6. PlayerPrefs.SetInt("AudioActive", 0);
  7. }
  8. else
  9. {
  10. AudioListener.volume = 0;
  11. PlayerPrefs.SetInt("AudioActive", 1);
  12. }
  13. }
  14. public void DisableMusicButton(Toggle toggle)
  15. {
  16. if (toggle.isOn)
  17. {
  18. menuMusic.GetComponent<AudioSource>().mute = false;
  19. PlayerPrefs.SetInt("MusicActive", 0);
  20. }
  21. else
  22. {
  23. menuMusic.GetComponent<AudioSource>().mute = true;
  24. PlayerPrefs.SetInt("MusicActive", 1);
  25. }
  26. }

 

Control下四个对象,用于设置操作相关

两个选项框用于设置操作模式

  1. public void ControlModeButtons(Toggle value)
  2. {
  3. if (value.isOn)
  4. PlayerPrefs.SetString("ControlMode", "Buttons");
  5. }
  6. public void ControlModeAccel(Toggle value)
  7. {
  8. if (value.isOn)
  9. PlayerPrefs.SetString("ControlMode", "Accel");
  10. }

下面是音量设置:都是一些简单的函数

  1. public void DisableAudioButton(Toggle toggle)
  2. {
  3. if (toggle.isOn)
  4. {
  5. AudioListener.volume = 1;
  6. PlayerPrefs.SetInt("AudioActive", 0);
  7. }
  8. else
  9. {
  10. AudioListener.volume = 0;
  11. PlayerPrefs.SetInt("AudioActive", 1);
  12. }
  13. }
  14. public void DisableMusicButton(Toggle toggle)
  15. {
  16. if (toggle.isOn)
  17. {
  18. menuMusic.GetComponent<AudioSource>().mute = false;
  19. PlayerPrefs.SetInt("MusicActive", 0);
  20. }
  21. else
  22. {
  23. menuMusic.GetComponent<AudioSource>().mute = true;
  24. PlayerPrefs.SetInt("MusicActive", 1);
  25. }
  26. }

保存敏感系数函数:

  1. public void EditSensitivity()
  2. {
  3. PlayerPrefs.SetFloat("Sensitivity", menuGUI.sensitivity.value);
  4. }

 

最后一个Erase All Data是激活下面的Reset Panel,进行数据清除

Reset Panel是一个红色背景和选择YES或者NO

  1. public void EraseSave()
  2. {
  3. //清除所有数据后重新加载
  4. PlayerPrefs.DeleteAll();
  5. currentVehicleNumber = 0;
  6. Application.LoadLevel(0);
  7. foreach (Material mat in allRestMaterials)
  8. mat.SetColor("_Color", new Color(0.7f, 0.7f, 0.7f));
  9. }

 

Fade Background是一个隐藏对象,如果激活后,会显示车轮样的加载图片,带有一个绑定了动画的Animator

 

到这里,UGUI的Canvas就分析完了

 

下一个,先看简单的Vehicle Root对象

里面装有12辆车和一个Shadow阴影

这12辆车就是汽车的3D模型,没什么好说的,Shadow是汽车的阴影

Shadow实现是利用Projector投影,用到一些阴影资源,这里就不深究了

下一个Garage对象,也很简单,就是一个车库3D模型

 

最后来看Main Camera:

Main Camera下有两个Audio Source,分别是背景音乐和点击音效

Main Camera首先绑定的是MainMenu:

这两篇文章都是围绕MainMenu讲的,现在从头来看:

先看一些全局变量:这里大部分的意思我都看懂了,不过有一部分我无法理解

  1. //金币
  2. private int gameScore { get; set; }
  3. //视角移动速度
  4. public float cameraRotateSpeed = 5;
  5. //加载背景
  6. public Animator FadeBackGround;
  7. //背景音乐
  8. public AudioSource menuMusic;
  9. //简单的GO
  10. public Transform vehicleRoot;
  11. //所有材质
  12. public Material[] allRestMaterials;
  13. //主界面:含有五个场景对象
  14. public MenuPanels menuPanels;
  15. //界面GUI,含有多个对象
  16. public MenuGUI menuGUI;
  17. //车辆数组,保存了汽车的各种信息
  18. public VehicleSetting[] vehicleSetting;
  19. //关卡数组,保存了关卡的信息
  20. public LevelSetting[] levelSetting;
  21. //默认以第一个界面开启
  22. private Panels activePanel = Panels.MainMenu;
  23. //含义暂定
  24. private bool vertical, horizontal;
  25. private Vector2 startPos;
  26. private Vector2 touchDeltaPosition;
  27. //鼠标按下位置记录
  28. private float x, y = 0;
  29. //当前车辆以及各种信息
  30. private VehicleSetting currentVehicle;
  31. private int currentVehicleNumber = 0;
  32. private int currentLevelNumber = 0;
  33. private Color mainColor;
  34. private bool randomColorActive = false;
  35. private bool startingGame = false;
  36. private float menuLoadTime = 0.0f;
  37. private AsyncOperation sceneLoadingOperation = null;

 

自定义的几个类:

  1. //游戏的GUI
  2. [System.Serializable]
  3. public class MenuGUI
  4. {
  5. public Text GameScore;
  6. public Text VehicleName;
  7. public Text VehiclePrice;
  8. public Slider VehicleSpeed;
  9. public Slider VehicleBraking;
  10. public Slider VehicleNitro;
  11. public Slider sensitivity;
  12. public Toggle audio;
  13. public Toggle music;
  14. public Toggle vibrateToggle;
  15. public Toggle ButtonMode, AccelMode;
  16. public Image wheelColor, smokeColor;
  17. public Image loadingBar;
  18. public GameObject loading;
  19. public GameObject customizeVehicle;
  20. public GameObject buyNewVehicle;
  21. }
  1. //五个场景的Panel
  2. [System.Serializable]
  3. public class MenuPanels
  4. {
  5. public GameObject MainMenu;
  6. public GameObject SelectVehicle;
  7. public GameObject SelectLevel;
  8. public GameObject EnoughMoney;
  9. public GameObject Settings;
  10. }
  1. //车辆信息
  2. [System.Serializable]
  3. public class VehicleSetting
  4. {
  5. public string name = "Vehicle 1";
  6. public int price = 20000;
  7. public GameObject vehicle;
  8. public GameObject wheelSmokes;
  9. public Material ringMat, smokeMat;
  10. public Transform rearWheels;
  11. public VehiclePower vehiclePower;
  12. //是否购买,隐藏
  13. [HideInInspector]
  14. public bool Bought = false;
  15. //车辆性能参数
  16. [System.Serializable]
  17. public class VehiclePower
  18. {
  19. public float speed = 80;
  20. public float braking = 1000;
  21. public float nitro = 10;
  22. }
  23. }
  1. //可以使用的几张地图信息
  2. [System.Serializable]
  3. public class LevelSetting
  4. {
  5. public bool locked = true;
  6. public Button panel;
  7. public Text bestTime;
  8. public Image lockImage;
  9. public StarClass stars;
  10. //该地图获得了几颗星
  11. [System.Serializable]
  12. public class StarClass
  13. {
  14. public Image Star1, Star2, Star3;
  15. }
  16. }

 

这个脚本其他所有的函数都有说过了,除了Awake和Update函数:

先来看看Awake函数:

  1. //初始化
  2. void Awake()
  3. {
  4. AudioListener.pause = false;
  5. Time.timeScale = 1.0f;
  6. //震动选项,这里没用
  7. menuGUI.vibrateToggle.isOn = (PlayerPrefs.GetInt("VibrationActive") == 0) ? true : false;
  8. //默认金币999999
  9. gameScore = 999999;
  10. //加载第一个场景
  11. CurrentPanel(0);
  12. //设置画质
  13. if (PlayerPrefs.GetInt("QualitySettings") == 0)
  14. {
  15. PlayerPrefs.SetInt("QualitySettings", 4);
  16. QualitySettings.SetQualityLevel(3, true);
  17. }
  18. else
  19. {
  20. QualitySettings.SetQualityLevel(PlayerPrefs.GetInt("QualitySettings") - 1, true);
  21. }
  22. //设置车辆敏感度
  23. if (PlayerPrefs.GetFloat("Sensitivity") == 0.0f)
  24. {
  25. menuGUI.sensitivity.value = 1.0f;
  26. PlayerPrefs.SetFloat("Sensitivity", 1.0f);
  27. }
  28. else
  29. {
  30. menuGUI.sensitivity.value = PlayerPrefs.GetFloat("Sensitivity");
  31. }
  32. //设置操作模式
  33. switch (PlayerPrefs.GetString("ControlMode"))
  34. {
  35. case "":
  36. menuGUI.ButtonMode.isOn = true;
  37. break;
  38. case "Buttons":
  39. menuGUI.ButtonMode.isOn = true;
  40. break;
  41. case "Accel":
  42. menuGUI.AccelMode.isOn = true;
  43. break;
  44. }
  45. //当前车辆
  46. currentLevelNumber = PlayerPrefs.GetInt("CurrentLevelNumber");
  47. //地图解锁情况处理
  48. for (int lvls = 0; lvls < levelSetting.Length; lvls++)
  49. {
  50. if (lvls <= PlayerPrefs.GetInt("CurrentLevelUnlocked"))
  51. levelSetting[lvls].locked = false;
  52. }
  53. //设置地图
  54. currentLevel(currentLevelNumber);
  55. //读取默认控制信息设置
  56. switch (PlayerPrefs.GetString("ControlMode"))
  57. {
  58. case "":
  59. PlayerPrefs.SetString("ControlMode", "Buttons");
  60. menuGUI.ButtonMode.isOn = true;
  61. break;
  62. case "Buttons":
  63. menuGUI.ButtonMode.isOn = true;
  64. break;
  65. case "Accel":
  66. menuGUI.AccelMode.isOn = true;
  67. break;
  68. }
  69. //默认只买了第一辆车
  70. PlayerPrefs.SetInt("BoughtVehicle0", 1);
  71. //背景音乐和音量设置
  72. menuGUI.audio.isOn = (PlayerPrefs.GetInt("AudioActive") == 0) ? true : false;
  73. AudioListener.volume = (PlayerPrefs.GetInt("AudioActive") == 0) ? 1.0f : 0.0f;
  74. menuGUI.music.isOn = (PlayerPrefs.GetInt("MusicActive") == 0) ? true : false;
  75. menuMusic.mute = (PlayerPrefs.GetInt("MusicActive") == 0) ? false : true;
  76. currentVehicleNumber = PlayerPrefs.GetInt("CurrentVehicle");
  77. currentVehicle = vehicleSetting[currentVehicleNumber];
  78. int i = 0;
  79. //遍历所有车辆,进行轮胎颜色烟雾设置
  80. foreach (VehicleSetting VSetting in vehicleSetting)
  81. {
  82. if (PlayerPrefsX.GetColor("VehicleWheelsColor" + i) == Color.clear)
  83. {
  84. vehicleSetting[i].ringMat.SetColor("_DiffuseColor", Color.white);
  85. }
  86. else
  87. {
  88. vehicleSetting[i].ringMat.SetColor("_DiffuseColor", PlayerPrefsX.GetColor("VehicleWheelsColor" + i));
  89. }
  90. if (PlayerPrefsX.GetColor("VehicleSmokeColor" + i) == Color.clear)
  91. {
  92. vehicleSetting[i].smokeMat.SetColor("_TintColor", new Color(0.8f, 0.8f, 0.8f, 0.2f));
  93. }
  94. else
  95. {
  96. vehicleSetting[i].smokeMat.SetColor("_TintColor", PlayerPrefsX.GetColor("VehicleSmokeColor" + i));
  97. }
  98. //Bought=true说明车没有买
  99. if (PlayerPrefs.GetInt("BoughtVehicle" + i.ToString()) == 1)
  100. {
  101. VSetting.Bought = true;
  102. if (PlayerPrefs.GetInt("GameScore") == 0)
  103. {
  104. PlayerPrefs.SetInt("GameScore", gameScore);
  105. }
  106. else
  107. {
  108. gameScore = PlayerPrefs.GetInt("GameScore");
  109. }
  110. }
  111. //显示当前车辆
  112. if (VSetting == vehicleSetting[currentVehicleNumber])
  113. {
  114. VSetting.vehicle.SetActive(true);
  115. currentVehicle = VSetting;
  116. }
  117. else
  118. {
  119. VSetting.vehicle.SetActive(false);
  120. }
  121. i++;
  122. }
  123. }

 

 

再看看Update方法:

  1. void Update()
  2. {
  3. //如果加载了下一个Scene
  4. if (sceneLoadingOperation != null)
  5. {
  6. //根据时间显示加载轮胎动画(圆形逐渐圆满)
  7. /*public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);
  8. 作用是将当前值current移向目标target。(对Vector3是沿两点间直线)
  9. maxDistanceDelta就是每次移动的最大长度。
  10. 返回值是当current值加上maxDistanceDelta的值,如果这个值超过了target,返回的就是target的值*/
  11. menuGUI.loadingBar.fillAmount = Mathf.MoveTowards(menuGUI.loadingBar.fillAmount, sceneLoadingOperation.progress + 0.2f, Time.deltaTime * 0.5f);
  12. //加载完成
  13. if (menuGUI.loadingBar.fillAmount > sceneLoadingOperation.progress)
  14. sceneLoadingOperation.allowSceneActivation = true;
  15. }
  16. if (menuGUI.smokeColor.gameObject.activeSelf || randomColorActive)
  17. {
  18. //车辆的后轮旋转
  19. vehicleSetting[currentVehicleNumber].rearWheels.Rotate(1000 * Time.deltaTime, 0, 0);
  20. //开启车辆轮胎烟雾
  21. vehicleSetting[currentVehicleNumber].wheelSmokes.SetActive(true);
  22. }
  23. else
  24. {
  25. vehicleSetting[currentVehicleNumber].wheelSmokes.SetActive(false);
  26. }
  27. //车辆参数的显示
  28. menuGUI.VehicleSpeed.value = vehicleSetting[currentVehicleNumber].vehiclePower.speed / 100.0f;
  29. menuGUI.VehicleBraking.value = vehicleSetting[currentVehicleNumber].vehiclePower.braking / 100.0f;
  30. menuGUI.VehicleNitro.value = vehicleSetting[currentVehicleNumber].vehiclePower.nitro / 100.0f;
  31. menuGUI.GameScore.text = gameScore.ToString();
  32. //如果车已购买
  33. if (vehicleSetting[currentVehicleNumber].Bought)
  34. {
  35. //一些简单的设置
  36. menuGUI.customizeVehicle.SetActive(true);
  37. menuGUI.buyNewVehicle.SetActive(false);
  38. menuGUI.VehicleName.text = vehicleSetting[currentVehicleNumber].name;
  39. menuGUI.VehiclePrice.text = "BOUGHT";
  40. PlayerPrefs.SetInt("CurrentVehicle", currentVehicleNumber);
  41. }
  42. else
  43. {
  44. //车没买的话一些简单的设置
  45. menuGUI.customizeVehicle.SetActive(false);
  46. menuGUI.buyNewVehicle.SetActive(true);
  47. menuGUI.VehicleName.text = vehicleSetting[currentVehicleNumber].name;
  48. menuGUI.VehiclePrice.text = "COST: " + vehicleSetting[currentVehicleNumber].price.ToString();
  49. }
  50. //我改了下源码,因为暂时用不到安卓系统
  51. if (Input.GetMouseButton(0) && activePanel != Panels.SelectLevel)
  52. {
  53. //这些数学函数我看不懂,但明白意思,就是鼠标点击屏幕出现是视觉效果和旋转效果
  54. x = Mathf.Lerp(x, Mathf.Clamp(Input.GetAxis("Mouse X"), -2, 2) * cameraRotateSpeed, Time.deltaTime * 5.0f);
  55. Camera.main.fieldOfView = Mathf.Clamp(Camera.main.fieldOfView, 50, 60);
  56. Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, 50, Time.deltaTime);
  57. }
  58. else {
  59. x = Mathf.Lerp(x, cameraRotateSpeed * 0.01f, Time.deltaTime * 5.0f);
  60. Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, 60, Time.deltaTime);
  61. }
  62. //慢慢旋转视角
  63. transform.RotateAround(vehicleRoot.position, Vector3.up, x);
  64. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号