日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity 项目仿cs知识点

發布時間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity 项目仿cs知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡介
1、人物部分
a、人物移動
b、鏡頭旋轉
c、玩家開槍:動畫、音頻、枚舉、彈孔、倍鏡
2、敵人部分
a、敵人克隆
b、走向玩家:距離,方向、朝向、點乘、叉乘

二、人物部分
(1)、人物移動

CharacterController c;//角色控制器Vector3 moveDirection = Vector3.zero;//移動方向float moveSpeed = 6, jumpSpeed = 4;float gravity = 20;void Start(){c = GetComponent<CharacterController>();}void Update(){if (c.isGrounded){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");//固定坐標的前后左右移動//direction = new Vector3(h, 0, v);//第一人稱移動,normalized表示長度1moveDirection = (transform.right * h + transform.forward * v).normalized;if (Input.GetButton("Jump")){moveDirection.y = jumpSpeed;}}//一直有一個重力加速度moveDirection.y -= gravity * Time.deltaTime;c.Move(moveDirection * moveSpeed * Time.deltaTime);}

談談Move和SimpleMove
1、SimpleMove
SimpleMove 只能在平面移動,不帶Y軸移動
移動自帶速度。所以不需要乘以Time.deltaTime
移動時自帶重力
2、Move
移動方向沒有限制
移動時候需要乘以Time.deltaTime
需要自己做重力

在(1)中單有第一人稱移動的代碼還不行,還需要通過鼠標控制人物方向,才能體現為第一人稱移動。

(2)、鏡頭旋轉(人物面向方向,腳本掛在人物上)

Vector3 cameraRotate;float rotateSpeed = 3f;void Update () {//獲取鼠標水平和豎直方向的偏移量float x = Input.GetAxis("Mouse X");float y = Input.GetAxis("Mouse Y");//左右旋轉(繞Y軸旋轉);cameraRotate.x -= y * rotateSpeed;//抬頭低頭(繞X軸旋轉)cameraRotate.y += x * rotateSpeed;//抬頭低頭范圍cameraRotate.x = Mathf.Clamp(cameraRotate.x, -45, 45);//左右旋轉范圍(CS人物是可以左右無限制旋轉的,所以這里可以去掉)//cameraRotate.y = Mathf.Clamp(cameraRotate.x,-90,90);transform.rotation = Quaternion.Euler(cameraRotate.x, cameraRotate.y, 0);}

為了更好的移動,可以試著鼠標隱藏

Cursor.lockState = CursorLockMode.Locked;

(3)、玩家開槍

Transform pos;//槍口位置private GameObject explosionFx;//爆炸特效private AudioClip explosionAudios, fireAudios;//爆炸音頻,開槍音頻void Start(){//動態加載資源(路徑: Assets/Resources/Prefabs/HitBlood)explosionFx = Resources.Load<GameObject>("Prefabs/HitBlood");explosionAudios = Resources.Load<AudioClip>("Audios/boom");fireAudios = Resources.Load<AudioClip>("Audios/shoot");}void Update(){if (Input.GetButtonDown("Fire1")){//點擊左鍵,槍口位置發出開槍音頻(自動消失)音量1AudioSource.PlayClipAtPoint(fireAudios, pos.position, 1f);RaycastHit hit;//碰撞信息//檢測射線(槍口位置,人物向前方向,碰撞信息,距離20米)if (Physics.Raycast(pos.position, transform.forward, out hit, 20)){GameObject go = Instantiate(explosionFx, hit.point, Quaternion.identity);Destroy(go, 1f);//播放爆炸特效(自動消失),音量1AudioSource.PlayClipAtPoint(explosionAudios, hit.point, 1f);Destroy(hit.collider.gameObject);}}}

注意:
(a)、cs應該用射線發射,由于要實現倍鏡(我沒法用準星對齊),最后我選擇用攝像機中心發射,而非槍口發射

(b)、開槍時需要有開槍動畫

//方法: Animation an;//動畫 void Start() {an.GetComponent<Animation>(); } //an.play("動畫名"); an.play("Fire2");

?、音頻

public class ResManage {//該類的目的是為了存儲字符串,簡潔其他類//聲音路徑public const string walk = "Sounds/playWalk";//走路聲音public const string run = "Sounds/playRun";//跑步聲音 } AudioClip landClip, runClip;//音頻片段AudioSource audios;//音頻組件void Start(){//音頻資源audios = GetComponent<AudioSource>();//動態加載資源,(體現ResManage類的目的)landClip = Resources.Load<AudioClip>(ResManage.walk);runClip = Resources.Load<AudioClip>(ResManage.run);}


(d)枚舉的應用
播放動畫時,通常都是用枚舉來寫(此處寫敵人的動畫)

enum States{Idle,Run,Death,Attack};void GetStates(States s){switch (s){case States.Idle:an.Play(ResManage.nurseIdle);break;case States.Run:an.Play(ResManage.nurseRun);break;case States.Death:an.Play(ResManage.nurseDeath);break;case States.Attack:an.Play(ResManage.nurseAttack);break;default:break;}}

用法:GetStates(States.Idle);
(e)、彈孔位置

if (Physics.Raycast(ray, out hit, 100))//攝像機發射{if (hit.collider.CompareTag("Plane")){//子彈打洞//打到地板克隆彈孔GameObject go = Instantiate(holeEffect, hit.point, holeEffect.transform.rotation);//讓彈孔與射線碰撞體的法線垂直(讓彈孔總是貼在碰撞體表面)go.transform.LookAt(hit.point - hit.normal);//讓彈孔與碰撞體表面保持0.03距離(這里看著合適就行)go.transform.Translate(Vector3.back * 0.03f);Destroy(go, 1f);}}

(f)、倍鏡(減表示放大倍數)
camera.GetComponent().fieldOfView-=45;
三、敵人部分
(1)、克隆敵人
(以某點(x1,y1,z1)為圓心范圍1~5米生成5個敵人)

for (int i = 0; i < 5; i++){float a = Random.Range(1, 5);//從原點坐標獲取任意一個方向的向量Vector2 b = Random.insideUnitCircle;//獲取向量的單位向量Vector2 c = b.normalized;//得到位置Vector3 d = new Vector3(x1 + c.x * a, y1, z1 + c.y * a);Instantiate(enemy, d, transform.rotation);}

(2)、敵人走向玩家
距離問題:
利用Vector.Distance(敵人位置,玩家位置);判斷距離從而進行播放動畫朝玩家靠近。

if (Vector3.Distance(transform.position, player.transform.position) <= 10)

方向問題:

//敵人指向玩家方向 dir = (player.transform.position - transform.position).normalized;

朝向問題:

transform.LookAt(player.transform.position);

(3)、判斷敵人位置
a、點乘

//點乘 float a = Vector3.Dot(transform.forward, enemy.transform.position - player.transform.position); if (a <= 0){tipWarn.text = "警告:后方發現敵人";} else{tipWarn.text = "警告:前方發現敵人";}

b、叉乘

總結

以上是生活随笔為你收集整理的unity 项目仿cs知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。