Unity3D制作3D虚拟漫游场景(二)
传送门:
————————————————————————–
昨天已经完成了场景的基本搭建,今天先简单的实现城市漫游功能,具体细节之后再进行添加
1.导入人物
在Assets文件夹下,新建一个文件夹,用于存放预制体,命名为Prefabs
打开昨天导入进去的SimplePeople资源包,打开其中的示例场景,然后我们可以进去挑选人物啦~
博主在这里选了一个画风清奇,很像程序员的一个人物“SimplePeople_BusinessMan_White”,选中,并将其拖放到Prefabs文件夹下
这样人物就准备就绪了。
2.设置场景
回到游戏场景(我命名的是“GameScene”),全选所有的地形(摄像机暂时除外),道路啊建筑啊,统一加上组件“MeshCollider”,方便与人物碰撞
3.将人物放置于场景
拖拽Prefabs文件夹里的人物到Scene视图,并为其添加CharacterController,设置属性如下
找到人物的位置,点击运行,可能会发现人物往下掉,这是因为刚才添加MeshCollider的时候,部分折叠的没有被添加上去,我们手动添加。
(报了很多错误,不过以前没有出现,并且错误暂时不影响游戏运行,最近会找一下原因所在,大家也可以在评论区指点一下,人多力量大^_^)
这时候人物就不会掉下去了,但是我们会发现,没有办法控制人物的移动,这就需要添加脚本进行控制了。
4.控制人物移动
在Scripts文件夹下,新建一个C#脚本,命名为“CharacterControl.cs”,代码如下
1 using UnityEngine; 2 using System.Collections; 3 4 public class CharacterControl : MonoBehaviour 5 { 6 //控制速度 7 public float moveSpeed = 10.0f; 8 public float rotateSpeed = 1.0f; 9 public float jumpSpeed = 4.0f; //跳跃速度 10 public float gravity = 1; //重力拉扯 11 12 private bool isMainPlayer = false; 13 private Animator personAnimator; 14 private CharacterController cc; 15 16 public bool isJump; 17 private bool isMove; 18 19 private CollisionFlags flags; 20 21 private Vector3 moveDirection; 22 23 24 // Use this for initialization 25 void Start() 26 { 27 if (this.gameObject.tag == "Player") 28 { 29 isMainPlayer = true; 30 cc = this.GetComponent<CharacterController>(); 31 } 32 personAnimator = gameObject.GetComponent<Animator>(); 33 } 34 35 // Update is called once per frame 36 void Update() 37 { 38 //如果当前脚本的对象是游戏者 39 if (isMainPlayer) 40 { 41 //控制移动或旋转 42 float h = Input.GetAxis("Horizontal"); 43 float v = Input.GetAxis("Vertical"); 44 h *= Time.deltaTime * moveSpeed; 45 v *= Time.deltaTime * moveSpeed; 46 transform.Translate(h, 0, v); 47 transform.Rotate(0, h * rotateSpeed, 0); 48 49 //FIX THIS BUG:无法后退,因为还没有设置后退的动画 50 if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1f) 51 { 52 personAnimator.SetFloat("Speed_f", moveSpeed); 53 } 54 55 else 56 { 57 personAnimator.SetFloat("Speed_f", 0); 58 } 59 60 61 62 63 //按下空格跳跃 64 //两种跳跃情况:原地跳和一边跑一边跳(脑补出表情包...) 65 if (Input.GetKeyDown(KeyCode.Space) && !isJump) 66 { 67 personAnimator.SetBool("Jump_b", true); 68 69 isJump = true; 70 moveDirection = transform.TransformDirection(moveDirection); 71 moveDirection.y = jumpSpeed; 72 73 } 74 else if (Input.GetKeyUp(KeyCode.Space)) 75 { 76 personAnimator.SetBool("Jump_b", false); 77 } 78 79 //if (isJump) 80 ///{ 81 //模拟重力 82 moveDirection.y -= gravity * Time.deltaTime; 83 flags = cc.Move(moveDirection * Time.deltaTime); 84 85 //when hit the ground 86 if (flags == CollisionFlags.Below) 87 { 88 isJump = false; 89 } 90 // } 91 } 92 93 } 94 }
接下来把脚本赋给人物,需要注意的就是,这段代码是根据Tag去判断是否为游戏者的(因为后期可能会添加一些自由移动的NPC),所以需要把人物的Tag设置为Player。
进入游戏,发现人物可以移动了,不过摄像机还不会跟随人物移动。
5.设置摄像机跟随
unity5.x的摄像机脚本与4有不同之处,所以我们先选一种简单的方法。
首先将Hierarchy中_Scene下的摄像机拖动到人物下。
设置摄像机属性如图
现在就可以漫游了。接下来就是控制动画的播放以及其他的细节处理了。