Unity3D制作3D虛擬漫游場景(二)


傳送門:

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下的攝像機拖動到人物下。

設置攝像機屬性如圖

現在就可以漫游了。接下來就是控制動畫的播放以及其他的細節處理了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM