简答题

一、游戏对象运动的本质是什么?

  游戏对象的本质是游戏对象每一帧的由空间属性决定的坐标随时间发生改变,其中空间属性包括对象transform属性中的空间位置Position属性、旋转角度Rotation属性、大小Scale属性。

二、用三种以上方法实现物体的抛物线运动

1.修改游戏对象Transfrom属性中的Position
  将游戏对象做平抛运动的速度分解为沿水平和竖直两个方向的分速度,在水平方向上做匀速直线运动,每单位时间变化xspeed个单位坐标,在数值方向上做初速度为0的匀加速直线运动,加速度为g,每单位时间变化yspeed个单位坐标。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class move1 : MonoBehaviour {public float xspeed = 1.0;public float yspeed = 0;public int g=1;//use this for initializationvoid start(){Debug.Log("Start!");}//Update is called once per framevoid Update(){yspeed += g;this.transform.position += Vector3.right * Time.deltaTime * xspeed;this.transform.position += Vector3.down * Time.deltaTime * yspeed;}}

2.使用向量Vector
  直接创建一个Vector3变量并定义其水平方向上是一个不变的数值,竖直方向上是一个从0开始均匀增加的数值,最后将游戏对象的Position属性与该Vector3相加,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class move1 : MonoBehaviour {public float xspeed = 1.0;public float yspeed = 0;public int g=1;//use this for initializationvoid start(){Debug.Log("Start!");}//Update is called once per framevoid Update(){yspeed += g;Vector3 vchange = new Vector3(Time.deltaTime * xspeed , -1 * Time.deltaTime * yspeed , 0);this.transform.position += vchange;}}

3.使用transform中的transform.Translate函数改变坐标
  将方法2中的变化向量Vector3传入Translate函数,实现position的改变,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class move1 : MonoBehaviour {public float xspeed = 1.0;public float yspeed = 0;public int g=1;//use this for initializationvoid start(){Debug.Log("Start!");}//Update is called once per framevoid Update(){yspeed += g;Vector3 vchange = new Vector3(Time.deltaTime * xspeed , -1 * Time.deltaTime * yspeed , 0);this.transform.Translate(vchange);}}

三、写一个程序实现一个完整的太阳系(星球转速不同且法平面不同)

  首先创建10个Sphere游戏对象,分别命名为太阳、水星、金星、地球、月球、火星、木星、土星、天王星、海王星,调整合适的位置和比例并将月球设为地球的子对象,将八大行星设为太阳的子对象。创建完成后目录结构如下:

3D视图和2D视图如下:

接着将游戏对象的贴图导入进Assets

将贴图覆盖到游戏对象上:


  并将太阳的MaterialsShader属性改为Legacy Shaders-Self Illumin - Diifuse(自发光):

  为了更贴近太阳系的真实情况(只有太阳这一自发光的光源),删除Directional Light。另外为了让太阳发出光照亮其他行星,在太阳中添加子物体Point Light,调整其颜色范围和亮度如下:

  然后将Main Camera的Clear Flags属性改为Solid Color,并将背景颜色更改为黑色,完成后运行画面如下:

  编写spin.cs代码文件实现各天体的法平面和速度不同的公转以及速度不同的自转,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class spin : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){GameObject.Find("Sun").transform.Rotate(Vector3.up * Time.deltaTime * 5 );  //太阳自转GameObject.Find("Mercury").transform.RotateAround(Vector3.zero, new Vector3(0.1f, 1, 0), 60 * Time.deltaTime);//设置公转的方向和速度  方向轴为(0, 1, 0) 速度为 60GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 58);//设置自转 自转速度为10000/58   58是水星的自传周期GameObject.Find("Venus").transform.RotateAround(Vector3.zero, new Vector3(0, 1, -0.1f), 55 * Time.deltaTime);GameObject.Find("Venus").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 243);GameObject.Find("Earth").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 10000);GameObject.Find("Moon").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 5 * Time.deltaTime);GameObject.Find("Moon").transform.Rotate(Vector3.up * Time.deltaTime * 10000/27);GameObject.Find("Mars").transform.RotateAround(Vector3.zero, new Vector3(0.2f, 1, 0), 45 * Time.deltaTime);GameObject.Find("Mars").transform.Rotate(Vector3.up * Time.deltaTime * 10000);GameObject.Find("Jupiter").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 2, 0), 35 * Time.deltaTime);GameObject.Find("Jupiter").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.3f);GameObject.Find("Saturn").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0.2f), 20 * Time.deltaTime);GameObject.Find("Saturn").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.4f);GameObject.Find("Uranus").transform.RotateAround(Vector3.zero, new Vector3(0, 2, 0.1f), 15 * Time.deltaTime);GameObject.Find("Uranus").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.6f);GameObject.Find("Neptune").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 1, -0.1f), 10 * Time.deltaTime);GameObject.Find("Neptune").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.7f);}
}

  编写完成后将cs文件拖到Sun对象上即可。最后调整Camera的属性(位置和拍摄角度)使其能完整清晰地看到整个太阳系:

运行结果如下:

编程实践

阅读以下游戏脚本:

Priests and Devils
Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit . There are 3 priests and 3 devils at one side of the river . They all want to get to the other side of this river , but there is only one boat and this boat can only carry two persons each time . And there must be one person steering the boat from one side to the other side . In the flash game , you can click on them to move them and click the go buton to move the boat to the other direction . If the priests are outnumbered by the devils on either side of the river , they get killed and the game is over . You can try it in many ways . Keep al priests alive ! Good luck !

  • 游戏中提及的事物
    &emsp&emsp牧师(3个)、魔鬼(3个)、小船(1艘)、河岸(左右两边)、河流。
  • 用表格列出玩家动作表(规则表),动作越少越好
当前状态 玩家操作 结果
牧师或恶魔在岸边,船上有空位 玩家点击靠近船一侧岸上的恶魔或牧师 恶魔或牧师上船
牧师或恶魔在船上且船过河靠岸 玩家点击船上的恶魔或牧师 恶魔或牧师上岸
其中一侧的恶魔多于牧师 显示玩家输
恶魔和牧师全部到达河对岸 显示玩家赢
  • 将游戏中对象做成预制
      创建5个Prefab:“Boat”、“Priest”、“Devil”、“water”、“MyCoast”,创建完成后的各Prefab如下:

      根据MVC架构(Model、View、Controller):

    我们首先构造一个Main空对象,并挂载MySceneController代码:


    MySceneController实现游戏的初始化和每一步的加载,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.Engine;public class MySceneController : MonoBehaviour, SceneController, UserAction{//对界面的控制readonly Vector3 water_pos = new Vector3 (0, 0.5f, 0);//初始化水的位置UserGUI user;//定义用户操作//在这个类里面需要放上需要的所有游戏对象,这样才能集中在一起管理public CoastController fromCoast;public CoastController toCoast;public BoatController boat;//private MyCharacterController[] characters;private List<MyCharacterController> team;void Update(){//Debug.Log("asd");}void Awake(){Director director = Director.get_Instance ();//实例化导演director.curren = this;user = gameObject.AddComponent<UserGUI> () as UserGUI;//添加GUI控制//characters = new MyCharacterController[6];team = new List<MyCharacterController>();loadResources ();}public void loadResources(){//资源的初始化加载GameObject water = Instantiate (Resources.Load ("Prefabs/water", typeof(GameObject)), water_pos, Quaternion.identity, null) as GameObject;water.name = "water";fromCoast = new CoastController ("from");toCoast = new CoastController ("to");boat = new BoatController ();for (int i = 0; i < 3; i++) {//对人物的加载MyCharacterController tem = new MyCharacterController ("priest");tem.setName ("priest" + i);tem.setPosition (fromCoast.getEmptyPosition ());tem.getOnCoast (fromCoast);fromCoast.getOnCoast (tem);team.Add (tem);}for (int i = 0; i < 3; i++) {MyCharacterController tem = new MyCharacterController ("devil");tem.setName ("devil" + i);tem.setPosition (fromCoast.getEmptyPosition ());tem.getOnCoast (fromCoast);fromCoast.getOnCoast (tem);team.Add (tem);}}public void moveboat(){if (boat.IfEmpty ())return;boat.boatMove ();//check whether game overuser.if_win_or_not = checkGameOver();}public void isClickChar (MyCharacterController tem_char){if (moveable.cn_move == 1)return;if (tem_char._isOnBoat ()) {CoastController tem_coast;if (boat.getTFflag () == -1) {tem_coast = toCoast;} else {tem_coast = fromCoast;}boat.getOffBoat (tem_char.getName ());tem_char.moveToPosition (tem_coast.getEmptyPosition ());tem_char.getOnCoast (tem_coast);tem_coast.getOnCoast (tem_char);} else {CoastController tem_coast2 = tem_char.getCoastController ();if (boat.getEmptyIndex () == -1)return;if (boat.getTFflag () != tem_coast2.getTFflag ())return;tem_coast2.getOffCoast (tem_char.getName());tem_char.moveToPosition (boat.getEmptyPosition ());tem_char.getOnBoat (boat);boat.getOnBoat (tem_char);}//check whether game over;user.if_win_or_not = checkGameOver();}public void restart(){boat.reset ();fromCoast.reset ();toCoast.reset ();foreach (MyCharacterController i in team) {i.reset ();}moveable.cn_move = 0;}public void pause(){boat.Mypause ();foreach (MyCharacterController i in team) {i.Mypause();}}public void Coninu (){boat.MyConti ();foreach (MyCharacterController i in team) {i.MyConti();}}private int checkGameOver(){if (moveable.cn_move == 1)return 0;int from_priest = 0;int from_devil = 0;int to_priest = 0;int to_devil = 0;int[] from_count = fromCoast.getCharacterNum ();from_priest = from_count [0];from_devil = from_count [1];int[] to_count = toCoast.getCharacterNum ();to_priest = to_count [0];to_devil = to_count [1];if (to_devil + to_priest == 6)return 1;//you winint[] boat_count = boat.getCharacterNum();if (boat.getTFflag () == 1) {from_priest += boat_count [0];from_devil += boat_count [1];} else {to_priest += boat_count [0];to_devil += boat_count [1];}if (from_priest < from_devil && from_priest > 0)return -1;//you loseif(to_priest < to_devil && to_priest > 0)return -1;//you losereturn 0;//not yet finish}}

  然后我们需要定义一个导演类Director来实现以下功能:

1.获取当前游戏的场景;
2.控制场景运行、切换、入栈与出栈;
3.暂停、恢复、退出;
4.管理游戏全局状态;
5.设定游戏的配置;
6.设定游戏全局视图。

  还有movable类来实现游戏对象的移动,CoastController类控制河岸的初始化和响应,CharacterController类控制游戏对象的初始化和对点击事件及游戏状态的响应,BoatController类控制船的初始化和响应。因为这几个类的结构和功能都比较相近所以整合在一个cs文件Base,cs中。具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace Com.Engine
{public class Director: System.Object{private static Director _instance;//实例化唯一的一个导演来控制public SceneController curren{ get; set;}public static Director get_Instance(){if (_instance == null){_instance = new Director();}return _instance;}}public interface SceneController{void loadResources();}public interface UserAction{//用户行为接口void moveboat();void isClickChar (MyCharacterController tem_char);void restart();void pause();void Coninu ();}//------------moveable---------------------------public class moveable: MonoBehaviour//对移动这一事件的控制{readonly float move_speed = 20;private int move_to_where;//0->not move, 1->to middle, 2->to destinationprivate Vector3 dest;private Vector3 middle;public static int cn_move = 0;//0->can move, 1->cant movevoid Update(){if (cn_move == 1)return;else{if(move_to_where == 1){transform.position = Vector3.MoveTowards(transform.position, middle, move_speed*Time.deltaTime);if (transform.position == middle)move_to_where = 2;}else if(move_to_where == 2){transform.position = Vector3.MoveTowards(transform.position, dest, move_speed*Time.deltaTime);if (transform.position == dest)move_to_where = 0;}}}public void SetDestination(Vector3 _dest){if (cn_move == 1)return;else{middle = _dest;dest = _dest;if (_dest.y < transform.position.y) {middle.y = transform.position.y;} else {middle.x = transform.position.x;}move_to_where = 1;}}public void reset(){if (cn_move == 1)return;else{move_to_where = 0;}}}//-----------CoastController---------------------public class CoastController{//对河岸的控制readonly GameObject coast;readonly Vector3 from_pos = new Vector3(9,1,0);//右岸的位置readonly Vector3 to_pos = new Vector3(-9,1,0);//左岸的位置readonly Vector3[] postion;//岸上的人物站的位置readonly int TFflag;//-1->to, 1->fromprivate MyCharacterController[] passengerPlaner;//河岸上的魔鬼与牧师public CoastController(string to_or_from){postion = new Vector3[] {//初始化人物可以站的位置new Vector3 (6.5f, 2.25f, 0),new Vector3 (7.5f, 2.25f, 0),new Vector3 (8.5f, 2.25f, 0),new Vector3 (9.5f, 2.25f, 0),new Vector3 (10.5f, 2.25f, 0),new Vector3 (11.5f, 2.25f, 0)};passengerPlaner = new MyCharacterController[6];//一个河岸最多6个人物if(to_or_from == "from"){//创建河岸coast = Object.Instantiate(Resources.Load("Prefabs/Mycoast", typeof(GameObject)), from_pos, Quaternion.identity, null) as GameObject;coast.name = "from";TFflag = 1;}else{coast = Object.Instantiate(Resources.Load("Prefabs/Mycoast", typeof(GameObject)), to_pos, Quaternion.identity, null) as GameObject;coast.name = "to";TFflag = -1;}}public int getTFflag(){return TFflag;}public MyCharacterController getOffCoast(string object_name){for(int i=0; i<passengerPlaner.Length; i++){if(passengerPlaner[i] != null && passengerPlaner[i].getName() == object_name){MyCharacterController myCharacter = passengerPlaner[i];passengerPlaner[i] = null;return myCharacter;}}return null;}public int getEmptyIndex(){for(int i=0; i<passengerPlaner.Length; i++){if(passengerPlaner[i] == null){return i;}}return -1;}public Vector3 getEmptyPosition(){int index = getEmptyIndex();Vector3 pos = postion[index];pos.x *= TFflag;return pos;}public void getOnCoast(MyCharacterController myCharacter){int index = getEmptyIndex();passengerPlaner[index] = myCharacter;}public int[] getCharacterNum(){int[] count = {0,0};for(int i=0; i<passengerPlaner.Length; i++){if(passengerPlaner[i] == null) continue;if(passengerPlaner[i].getType() == 0) count[0]++;else count[1]++;}return count;}public void reset(){passengerPlaner = new MyCharacterController[6];}}//-----------CharacterController-----------------public class MyCharacterController{//对人物的定义,包括魔鬼与牧师readonly GameObject character;readonly moveable Cmove;readonly ClickGUI clickgui;readonly int Ctype;//0->priset, 1->devilprivate bool isOnboat;private CoastController coastcontroller;public MyCharacterController(string Myname){if(Myname == "priest"){character = Object.Instantiate(Resources.Load("Prefabs/Priest", typeof(GameObject)), Vector3.zero, Quaternion.identity,null) as GameObject;Ctype = 0;}else{character = Object.Instantiate(Resources.Load("Prefabs/Devil", typeof(GameObject)), Vector3.zero, Quaternion.identity,null) as GameObject;Ctype = 1;}Cmove = character.AddComponent(typeof(moveable)) as moveable;clickgui = character.AddComponent(typeof(ClickGUI)) as ClickGUI;clickgui.setController(this);}public int getType(){return Ctype;}public void setName(string name){character.name = name;}public string getName(){return character.name;}public void setPosition(Vector3 postion){character.transform.position = postion;}public void moveToPosition(Vector3 _dest){Cmove.SetDestination (_dest);}public void getOnBoat(BoatController tem_boat){coastcontroller = null;character.transform.parent = tem_boat.getGameObject ().transform;isOnboat = true;}public void getOnCoast(CoastController coastCon){coastcontroller = coastCon;character.transform.parent = null;isOnboat = false;}public bool _isOnBoat(){return isOnboat;}public CoastController getCoastController(){return coastcontroller;}public void reset(){Cmove.reset ();coastcontroller = (Director.get_Instance ().curren as MySceneController).fromCoast;getOnCoast(coastcontroller);setPosition (coastcontroller.getEmptyPosition ());coastcontroller.getOnCoast (this);}public void Mypause(){moveable.cn_move = 1;}public void MyConti(){moveable.cn_move = 0;}}//------------------------------BoatController--------------------------------------public class BoatController{//对船的行为等的定义readonly GameObject boat;readonly moveable Cmove;readonly Vector3 fromPos = new Vector3 (5, 1, 0);//船靠岸时在左岸与右岸的位置readonly Vector3 toPos = new Vector3 (-5, 1, 0);readonly Vector3[] from_pos;//船上的位置readonly Vector3[] to_pos;private int TFflag;//-1->to, 1->fromprivate MyCharacterController[] passenger = new MyCharacterController[2];//船上同时最多2人public BoatController(){TFflag = 1;from_pos = new Vector3[]{ new Vector3 (4.5f, 1.5f, 0), new Vector3 (5.5f, 1.5f, 0) };//初始化船在两岸时人物可站的位置to_pos = new Vector3[]{ new Vector3 (-5.5f, 1.5f, 0), new Vector3 (-4.5f, 1.5f, 0) };boat = Object.Instantiate (Resources.Load ("Prefabs/Boat", typeof(GameObject)), fromPos, Quaternion.identity, null) as GameObject;boat.name = "boat";Cmove = boat.AddComponent (typeof(moveable)) as moveable;boat.AddComponent (typeof(ClickGUI));}public void boatMove(){if (TFflag == 1) {Cmove.SetDestination (toPos);TFflag = -1;} else {Cmove.SetDestination (fromPos);TFflag = 1;}}public void getOnBoat(MyCharacterController tem_cha){int index = getEmptyIndex ();passenger [index] = tem_cha;}public MyCharacterController getOffBoat(string object_name){for (int i = 0; i < passenger.Length; i++) {if (passenger [i] != null && passenger [i].getName () == object_name) {MyCharacterController temp_character = passenger [i];passenger [i] = null;return temp_character;}}return null;}public int getEmptyIndex(){for (int i = 0; i < passenger.Length; i++) {if (passenger [i] == null)return i;}return -1;}public bool IfEmpty(){for (int i = 0; i < passenger.Length; i++) {if (passenger [i] != null)return false;}return true;}public Vector3 getEmptyPosition(){Vector3 pos;int index = getEmptyIndex ();if (TFflag == 1) {pos = from_pos [index];} else {pos = to_pos [index];}return pos;}public GameObject getGameObject(){return boat;}public int getTFflag(){return TFflag;}public int[] getCharacterNum(){int[] count = { 0, 0 };for (int i = 0; i < passenger.Length; i++) {if (passenger [i] == null)continue;if (passenger [i].getType () == 0) {count [0]++;} else {count [1]++;}}return count;}public void reset(){Cmove.reset ();if (TFflag == -1) {boatMove ();}passenger = new MyCharacterController[2];}public void Mypause(){moveable.cn_move = 1;}public void MyConti(){moveable.cn_move = 0;}}
}

  ClickGUI用来实现鼠标点击事件的响应:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.Engine;public class ClickGUI : MonoBehaviour {// Use this for initializationUserAction action;MyCharacterController character;public void setController(MyCharacterController tem){character = tem;}void Start(){action = Director.get_Instance ().curren as UserAction;}void OnMouseDown(){if (gameObject.name == "boat") {action.moveboat ();} else {action.isClickChar (character);}}
}

  UserGUI用来搭建玩家交互界面:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using Com.Engine;public class UserGUI : MonoBehaviour {//用户可操作的行为事件private UserAction action;private GUIStyle MyStyle;//对界面(字体等)的控制private GUIStyle MyButtonStyle;public int if_win_or_not;private int t = 60;private int now, init;public Text lab;private void Update(){/*int temptime = (int)Time.time;now = init - temptime;lab.text = ctt(now);tt += Time.deltaTime;if (tt > 1){t--;GUI.Label(new Rect(10, 10, Screen.width / 8, 30), "" + t);}*/}string ctt(int s){int h = s / 3600;int m = (s - h * 300) / 60;int se = s % 60;return string.Format("{0:D2}", se);}void Start(){action = Director.get_Instance ().curren as UserAction;MyStyle = new GUIStyle ();MyStyle.fontSize = 40;MyStyle.normal.textColor = new Color (255f, 0, 0);MyStyle.alignment = TextAnchor.MiddleCenter;MyButtonStyle = new GUIStyle ("button");MyButtonStyle.fontSize = 30;init = 60;now = 60;//t = 60;//ctt(now);}void reStart(){if (GUI.Button (new Rect (Screen.width/2-Screen.width/8, Screen.height/2+100, 150, 50), "Restart", MyButtonStyle)) {if_win_or_not = 0;action.restart ();moveable.cn_move = 0;}//t = 60;}void IsPause(){//创建暂停与继续键,实际上是没有必要的/*if (GUI.Button (new Rect (Screen.width / 2 - 350, Screen.height / 2 + 100, 150, 50), "Pause", MyButtonStyle)) {if (moveable.cn_move == 0) {action.pause ();moveable.cn_move = 1;} } else if (GUI.Button (new Rect (Screen.width-Screen.width/2, Screen.height / 2 + 100, 150, 50), "Continue", MyButtonStyle)) {if (moveable.cn_move == 1) {action.Coninu();moveable.cn_move = 0;}}*/}private float tt = 0;void OnGUI(){IsPause ();reStart ();if(moveable.cn_move == 1)GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "Pausing", MyStyle);if (if_win_or_not == -1) {GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "Game Over!!!", MyStyle);IsPause ();reStart ();} else if (if_win_or_not == 1) {GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "You Win!!!", MyStyle);IsPause ();reStart ();}}
}

  游戏运行结果如下:

3D游戏编程与设计作业2-太阳系-Priests and Devils相关推荐

  1. 3D游戏编程与设计作业10

    3D游戏编程与设计作业10 环境说明 Unity3D 导航与寻路 Agent 和 Navmesh 练习 Obstacle和Off-Mesh-Link练习 P&D 过河游戏智能帮助实现 状态图 ...

  2. 3D游戏编程与设计作业09

    3D游戏编程与设计作业09 UGUI基础 画布 基础概念 测试渲染模式 UI布局基础 基本概念 锚点练习 UI组件与元素 基本概念 Mask练习 动画练习 富文本测试 简单血条 血条(Health B ...

  3. 3D游戏编程与设计作业六

    改进飞碟(Hit UFO)游戏 要求 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 实现 原项目:3D编程与游戏设计作业五 仅仅对其中的一些类进行改动就能实现. ...

  4. 3D游戏编程与设计作业三

    第三次3D编程作业 本次作业源代码链接:点击此处进行跳转 1. 简答并用程序验证 游戏对象运动的本质是什么 游戏对象空间属性(坐标.旋转度.大小)的变化 请用三种以上方法,实现物体的抛物线运动 此处我 ...

  5. 3D游戏编程与设计作业4-Skybox_牧师与魔鬼进阶版

    基本操作演练 下载Fantasy Skybbox FREE,构建自己的游戏场景 直接在上一次作业的Priests and Devils游戏场景中添加天空盒和地形构建场景.首先在Unity Assets ...

  6. 3D游戏编程与设计作业6-Unity实现打飞碟游戏改进版(Hit UFO)

    改进飞碟(Hit UFO)游戏 游戏内容要求 按adapter模式设计图修改飞碟游戏 使它同时支持物理运动与运动学(交换)运动 编程实践 本次作业直接在上一次打飞碟游戏的基础上增加adapter设计模 ...

  7. 3D游戏编程与设计作业四

    第四次3D编程作业 本次作业源代码链接:点击此处进行跳转 一. 基本操作演练 下载Fantasy Skybox Free,构建自己的游戏场景 场景总览图: 游玩截图: 写一个简单的总结,总结游戏对象的 ...

  8. 3D游戏编程与设计作业一

    游戏分类与热点探索 使用思维导图描述游戏的分类.(游戏分类方法特别多) 所使用的思维导图绘图工具为mindmaster. 结合手机游戏市场的下载量与排名等数据,结合游戏分类图,描述游戏市场的热点. 华 ...

  9. 3D游戏编程与设计作业4——使用skybox构建游戏场景

    步骤1: 首先下载支持使用Fantacy Skybox FREE 的Unity版本(2021.3) 步骤2:打开unity store, 搜索Fantacy Skybox FREE 并进行下载 步骤3 ...

最新文章

  1. MapReduce学习总结之Combiner、Partitioner、Jobhistory
  2. 【page-monitor 前端自动化 上篇】初步调研
  3. [转载]We Recommend a Singular Value Decomposition
  4. Makefile简易教程
  5. js显示PHP源代码命令,layedit富文本编辑器中如何添加显示源码功能(代码)
  6. 安装 SQL Server 2005 时出现性能计数器要求安装错误的解决办法
  7. 电子工程师名片——FAT16文件系统(转)
  8. 无法加载oracle驱动程序998,无法加载oracle in oradb10g_home2 odbc驱动程序的安装例程,因为存在系统错误代码998 解决方法...
  9. 解决andr_Android和iPhone浏览器大战,第2部分,为iPhone和Android构建基于浏览器的应用程序
  10. 水清冷冷:Prcc 2018永久安装图文教程(附工具补丁)
  11. 国密SM2算法陷入安全危机? 假!SM2仍然安全
  12. 中国移动亮相2012亚洲移动通信博览会
  13. iOS 动画篇 - pop动画库
  14. 如何在Mac上减少PDF文件大小
  15. 解决:微软拼音输入法不显示选字栏,微软的拼音输入法第一个候选词不显示
  16. SDL农场游戏开发 1.环境搭建
  17. 各类抽奖活动开发总结及分析
  18. Dynamips路由模拟器使用心得
  19. Vibrator motor驱动
  20. 【包你说】红包怎么玩,由你说了算!

热门文章

  1. java获取下月末,java获取每月月末日期
  2. Unity添加GIF动画
  3. 《西法的刷题秘籍》电子书开放下载啦~
  4. Google Play ASO 系列 - 尽力获得官方推荐
  5. 策略验证_买入口诀_双管齐下买进不怕
  6. Selenium2Library 主要关键字
  7. e-icon-picker
  8. latch: cache buffers chains latch: ges resource hash list
  9. 浏览器页面性能分析指南(chrome)
  10. python os.path.split_python 中的split()函数和os.path.split()函数