官术网_书友最值得收藏!

Wandering around

This technique works like a charm for random crowd simulations, animals, and almost any kind of NPC that requires random movement when idle.

Getting ready

We need to add another function to our AgentBehaviour class called OriToVec that converts an orientation value to a vector.

public Vector3 GetOriAsVec (float orientation) {
    Vector3 vector  = Vector3.zero;
    vector.x = Mathf.Sin(orientation * Mathf.Deg2Rad) * 1.0f;
    vector.z = Mathf.Cos(orientation * Mathf.Deg2Rad) * 1.0f;
    return vector.normalized;
}

How to do it...

We could see it as a big three-step process in which we manipulate the internal target position in a parameterized random way, face that position, and move accordingly:

  1. Create the Wander class deriving from Face:
    using UnityEngine;
    using System.Collections;
    
    public class Wander : Face
    {
        public float offset;
        public float radius;
        public float rate;
    }
  2. Define the Awake function in order to set up the internal target:
    public override void Awake()
    {
        target = new GameObject();
        target.transform.position = transform.position;
        base.Awake();
    }
  3. Define the GetSteering function:
    public override Steering GetSteering()
    {
        Steering steering = new Steering();
        float wanderOrientation = Random.Range(-1.0f, 1.0f) * rate;
        float targetOrientation = wanderOrientation + agent.orientation;
        Vector3 orientationVec = OriToVec(agent.orientation);
        Vector3 targetPosition = (offset * orientationVec) + transform.position;
        targetPosition = targetPosition + (OriToVec(targetOrientation) * radius);
        targetAux.transform.position = targetPosition;
        steering = base.GetSteering();
        steering.linear = targetAux.transform.position - transform.position;
        steering.linear.Normalize();
        steering.linear *= agent.maxAccel;
        return steering;
    }

How it works...

The behavior takes into consideration two radii in order to get a random position to go to next, looks towards that random point, and converts the computed orientation into a direction vector in order to advance.

How it works...

A visual description of the parameters for creating the Wander behavior

主站蜘蛛池模板: 麻江县| 南部县| 玛多县| 长武县| 娄烦县| 曲阜市| 江口县| 清水河县| 织金县| 伊金霍洛旗| 鲁甸县| 达日县| 阜康市| 扎鲁特旗| 潜江市| 遵义市| 安多县| 大港区| 罗源县| 平和县| 建始县| 凤山县| 乌拉特前旗| 长乐市| 鄱阳县| 兰溪市| 崇礼县| 赫章县| 安化县| 梨树县| 丰镇市| 客服| 凌云县| 启东市| 车险| 确山县| 南汇区| 大余县| 运城市| 且末县| 博罗县|