Unity 游戏光明之光笔记
第三章 创立游戏运行场景及角色管制
- 创立场景导入资源等
- 标签治理
应用标签来进行断定,应用const缩小代码的出错率
//高空标签 public const string ground = "Ground";//const 表明这个是一个共有的不可变的变量 //玩家标签 public const string player = "Player";
- 鼠标管制人物挪动
鼠标点击高空特效,在角色上挂载脚本脚本
public GameObject effect_click_prefab; void Update() { //检测鼠标的按下 //将鼠标的坐标转换为射线该 //射线与高空产生碰撞返回产生碰撞的点,而后让角色转向该点,开始挪动。当挪动到肯定范畴时进行挪动。 if (Input.GetMouseButtonDown(0)) { Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition); //保留碰撞信息 RaycastHit hitInfo; bool isCollider = Physics.Raycast(ray, out hitInfo); if(isCollider&& hitInfo.collider.tag ==Tags.ground) { //实例化点击的成果 showClickEffect(hitInfo.point); } } void showClickEffect(Vector3 hitPoint) { hitPoint = new Vector3(hitPoint.x, hitPoint.y+0.1f,hitPoint.z); GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity); } }
管制配角的朝向(鼠标点击高空的时候转向)
减少两个对象
private Vector3 targetPosition = Vector3.zero;private bool isMoving = false;//示意鼠标是否按下
在update办法的 if(isCollider&& hitInfo.collider.tag ==Tags.ground)中减少
isMoving = true; LookAtTarget(hitInfo.point);
在update办法中减少两个断定语句
if (Input.GetMouseButtonUp(0)) { isMoving = false; }if (isMoving) { //失去要挪动的指标地位 //让配角朝向指标地位 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; bool isCollider = Physics.Raycast(ray, out hitInfo); if (isCollider && hitInfo.collider.tag == Tags.ground) { LookAtTarget(hitInfo.point); } }
减少一个lookat办法
void LookAtTarget(Vector3 hitPoint) { targetPosition = hitPoint; targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z); this.transform.LookAt(targetPosition); }
管制配角的挪动,添PlayerMove脚本挂载到角色上
默认值是以后地位不会在游戏一开始时就运行在PlayDir脚本Start函数中增加
targetPosition = transform.position;
public float speed = 4; private PlayerDir dir;private CharacterController controller;void Start() { dir = this.GetComponent<PlayerDir>(); controller = this.GetComponent<CharacterController>(); }void Update() { float distance = Vector3.Distance(dir.targetPosition, transform.position); if (distance > 0.3f) { isMoving = true; //state = PlayerState.Moving; controller.SimpleMove(transform.forward * speed); } }
增加人物动画
管制人物动画播放的脚本
using UnityEngine;using System.Collections;public class PlayerAnimation : MonoBehaviour{ private PlayerMove move; void Start() { move = this.GetComponent<PlayerMove>(); } void LateUpdate() { if (move.state == PlayerState.Moving) { PlayAnim("Run"); } else if (move.state == PlayerState.Idle) { PlayAnim("Idle"); } } void PlayAnim(string animName) { GetComponent<Animation>().CrossFade(animName); }}
留神在void PlayAnim办法中教程中应用的旧版的代码,新版的代码为
GetComponent<Animation>().CrossFade(animName);
欠缺的PlayerDir代码
public class PlayerDir : MonoBehaviour{ public GameObject effect_click_prefab; public Vector3 targetPosition = Vector3.zero; private PlayerMove playerMove; private bool isMoving = false;//示意鼠标是否按下 private void Start() { //默认值是以后地位不会在游戏一开始时就运行 targetPosition = transform.position; playerMove = this.GetComponent<PlayerMove>(); } void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; bool isCollider = Physics.Raycast(ray, out hitInfo); if (isCollider && hitInfo.collider.tag == Tags.ground) { isMoving = true; ShowClickEffect(hitInfo.point); LookAtTarget(hitInfo.point); } } if (Input.GetMouseButtonUp(0)) { isMoving = false; } if (isMoving) { //失去要挪动的指标地位 //让配角朝向指标地位 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; bool isCollider = Physics.Raycast(ray, out hitInfo); if (isCollider && hitInfo.collider.tag == Tags.ground) { LookAtTarget(hitInfo.point); } } else { if (playerMove.isMoving) { LookAtTarget(targetPosition); } } } //实例化进去点击的成果 void ShowClickEffect(Vector3 hitPoint) { hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.1f, hitPoint.z); GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity); } //让配角朝向指标地位 void LookAtTarget(Vector3 hitPoint) { targetPosition = hitPoint; targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z); this.transform.LookAt(targetPosition); }}
- 管制相机追随配角的挪动
在主摄像机挂在FollowCamera脚本
private Transform player; private Vector3 offsetPosition;//地位偏移 void Start() { player = GameObject.FindGameObjectWithTag(Tags.player).transform; //使相机永远朝向配角 transform.LookAt(player.position); offsetPosition = transform.position - player.position; } void Update() { transform.position = offsetPosition + player.position; }
应用鼠标滑动管制相机视线的拉近和拉远
定义一个 public float scrollSpeed = 10;
在下面的Update办法中减少 ScrollView();办法
void ScrollView() { //print(Input.GetAxis("Mouse ScrollWheel"));//向后 返回负值 (拉近视线) 向前滑动 返回正值(拉远视线) distance = offsetPosition.magnitude; //获取鼠标中键的值 distance += Input.GetAxis("Mouse ScrollWheel") *- scrollSpeed; distance = Mathf.Clamp(distance, 2, 18); offsetPosition = offsetPosition.normalized * distance; }
留神要在distance += Input.GetAxis("Mouse ScrollWheel") *- scrollSpeed;中的
- scrollSpeed负号,才是与实际效果统一
相机间隔的限度
distance = Mathf.Clamp(distance, 2, 18);
相机的旋转
void RotateView() { //Input.GetAxis("Mouse X");//失去鼠标在程度方向的滑动 //Input.GetAxis("Mouse Y");//失去鼠标在垂直方向的滑动 if (Input.GetMouseButtonDown(1)) { isRotating = true; } if (Input.GetMouseButtonUp(1)) { isRotating = false; } if (isRotating) { transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X")); Vector3 originalPos = transform.position; Quaternion originalRotation = transform.rotation; transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));//影响的属性有两个 一个是position 一个是rotation float x = transform.eulerAngles.x; if (x < 10 || x > 80) {//当超出范围之后,咱们将属性归位原来的,就是让旋转有效 transform.position = originalPos; transform.rotation = originalRotation; } } offsetPosition = transform.position - player.position; }
留神方向函数的符号,还有update办法中调用的程序
限定旋转的方向
float x = transform.eulerAngles.x; if (x < 10 || x > 80) {//当超出范围之后,咱们将属性归位原来的,就是让旋转有效 transform.position = originalPos; transform.rotation = originalRotation; }
- 减少角色状态信息
给角色增加playerstatus脚本
public int grade = 1; public int hp = 100; public int mp = 100; public int coin = 200;//金币数量 public int attack = 20; public int attack_plus = 0; public int def = 20; public int def_plus = 0; public int speed = 20; public int speed_plus = 0; public int point_remain = 0;//残余的点数
【游戏开发】