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;//残余的点数
【游戏开发】
发表回复