傳送門:
--------------------------------------------------------------------------
昨天已經完成了場景的基本搭建,今天先簡單的實現城市漫游功能,具體細節之后再進行添加
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下的攝像機拖動到人物下。
設置攝像機屬性如圖
現在就可以漫游了。接下來就是控制動畫的播放以及其他的細節處理了。